- 注册时间
- 2004-8-29
- 最后登录
- 1970-1-1
|
1.另类杀人游戏
周末的晚上,百度的员工们总喜欢聚集在公司的会议室玩杀人游戏。从1警1匪到n警n匪,他们尝试了几乎所有流行的杀人游戏规则。终于有一天,连最热衷杀人游戏的“杀人不眨眼”的Austin也开始对无休止的辩论感到厌烦。于是,他决定改变他的一贯作风,他开始变成了一个“杀人不睁眼”的杀手。
如何做到“杀人不睁眼”呢?Austin早已构思好他的杀人计划:
<OL>N个人(包括Austin)坐成一圈玩杀人游戏,按顺时针编号 1 2 3 4 ... ...
Austin从1号开始顺时针开始数到第m号就杀掉第一个人,被杀掉的人要退出游戏。
如果第m个人恰好是Austin自己,他就杀掉他顺时针方向的下一个人。
Austin从被杀的人的下一个顺时针数m个人,把第m个杀掉。
重复2-4,直至杀掉所有人。
</OL>
Austin把这个杀人计谋告诉了法官小k,他便可以闭起眼睛杀人啦。作为一个正直善良的法官,小k当然不能让残忍的Austin得逞,于是,她偷偷把Austin的杀人计划告诉了作为警察的你,聪明的百度之星。现在,你的任务是活到最后,与“杀人不睁眼”的Austin对决。
输入要求:
第一个行包含一个整数K,表示有K组测试数据。 对于每组测试数据三个整数:
N,M,T,(3<=N<=10000,1<=M,T<=10000)
分别表示参与游戏的人数,Austin每隔M个人会杀掉一人,Austin初始位置的标号。
输入样例:
2
7 4 1
7 4 1
样例:in.txt
输出要求:
每个测试数据输出一个整数。
你需要选择的初始位置的序号,以确保最后剩下的两个人是你与Austin。
输出样例:
5
5
例子说明:杀人顺序为4 2 7 6 3 5 , 所以5 是你要选择的位置。
附:解答程序的LAV版,算法的时间复杂度为O(N),在WQX NC3000上4s内可解答出n<=1000的情形。
- /**
- @ Content:杀人游戏之递归算法LAV版
- @ Author :Eastsun
- @ Version:1.0
- */
- #define MAX_N 1000
- #define MAX_LEN 8
- int solve(int n,int m,int k){
- int killer[MAX_N+1];
- int index,temp,result;
- m--; k--;
- killer[n] =k;
- for(index =n-1;index>=3;index--)
- if((temp=m%(index+1))==killer[index+1])killer[index] =index -1;
- else killer[index] =(killer[index+1]+index-temp)%(index+1);
- if(killer[3]==m%3) result =(killer[3]+2)%3;
- else result =3-killer[3]-m%3;
- for(index =4;index<=n;index++)
- if(killer[index]==m%index) result =(result+m+2)%index;
- else result =(result+m+1)%index;
- return result+1;
- }
- long getNum(int x,int y,int max){//取得一个不大于max的正数
- char numKey[11];
- char buf[MAX_LEN+2],key;
- long num,n,k;
- strcpy(numKey,"0bnmghjtyu");
- buf[MAX_LEN+1] =0;
- n =num =0;
- while(1){
- memset(buf+n,' ',MAX_LEN+1-n);
- buf[n] ='_';
- TextOut(x,y,buf,0x41);
- key =getchar();
- if(key==0x0d){
- TextOut(x+n*6,y," ",0x41);
- return num;
- }
- if(key==0x1b){
- TextOut(x+n*6,y," ",0x41);
- return -1;
- }
- if(key==23&&n>0){
- n--;
- num =num/10;
- }
- else{
- for(k=0;k<10&&numKey[k]!=key;k++);
- if(k>=10||n>=MAX_LEN||num*10+k>max) continue;
- buf[n++]=k+'0';
- num =num*10+k;
- }
- }
- }
- void main(){
- int n,m,k;
- char text[20];
- while(1){
- ClearScreen();
- Refresh();
- TextOut(2,1,"Input N(2<N<1001):",0x41);
- if((n=getNum(110,1,1000))<3) break;
- TextOut(2,15,"Input M(0<M):",0x41);
- if((m=getNum(80,15,0x7fff))<=0) break;
- TextOut(2,29,"Input K(0<K<=N):",0x41);
- if((k=getNum(98,29,n))<=0) break;
- sprintf(text,"Position :%d",solve(n,m,k));
- TextOut(8,43,text,0x41);
- if(getchar()==0x1b) break;
- }
- }
复制代码
[此贴子已经被作者于2006-6-21 23:24:44编辑过]
|
|