又一次因为一个小错误,POJ上Wrong Answer了无数次。。。。。
在差不多要放弃的时候,发现了这个猥琐的不能再猥琐的bug,改完了提交就AC了,简直无语。。。。
本题wo采用模拟方法:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 struct child{ 6 char name[16]; 7 int id; 8 //child(string, int); 9 }cd[100]; 10 void init(int n){ 11 char s[16]; 12 for(int i=1;i<=n;i++){ 13 scanf("%s",cd[i].name); 14 cd[i].id=0; 15 } 16 } 17 int main(){ 18 int n,w,s; char c; 19 scanf("%d",&n); 20 init(n); 21 scanf("%d%c%d",&w,&c,&s); 22 cd[w].id=1; 23 int pt=w; 24 int kill=0; 25 while(true){ 26 int step=s%(n-kill)-1; 27 if(step<=0) step=step+n-kill; 28 /* 29 这里的取模运算是考虑到s值可能非常大,如果这样的话,模拟报数过程1。。。。s将会非常 30 耗时间。 31 至于为什么这么取模,自己算一算就明白了。 32 */ 33 for(int i=1;i<=step;i++){ 34 int ptr=pt%n+1; 35 while(cd[ptr].id==-1){//要跳过已经被kill的元素 36 ptr=ptr%n+1; 37 } 38 cd[ptr].id=cd[pt].id+1; 39 pt=ptr; 40 }//这里的pt指向的就是我们要删除的元素 41 cd[pt].id=-1;//将id赋值为-1,相当于删除动作 42 printf("%s\n",cd[pt].name); 43 kill++; 44 if(kill==n) break; //已经清空,跳出循环 45 int ptr=pt%n+1; 46 while(cd[ptr].id==-1){ 47 ptr=ptr%n+1; 48 } 49 cd[ptr].id=1; 50 pt=ptr; 51 52 } 53 //system("pause"); 54 return 0; 55 }
时间: 2024-12-28 11:01:10