HDU1276
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescription
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
题解:本来题目是用链表的方法,本人愚钝,不会用,看了别人的博客才明白,在最后展示
我采用模拟的方法,即直接按照题意写出。
要注意最后输出的格式!
下面这个代码是错误的。很久才找到错误所在。只是一个小小的错误(最下面有AC的代码)
#include<iostream> using namespace std; int main() { int i,t,n,p; int f=0; int a[5100]; cin>>t; while(t--) { int q;//定义整型变量,n赋值给q cin>>n; q=n; for(i=1; i<=n; i++) a[i]=i; while(q>3) //判断条件 { p=0; for(i=1; i<=n; i++) { if(a[i]==0) continue; else p++; if(p==2) { a[i]=0; f+=1; //统计出列士兵个数 p=0; } } q=q-f; if(q<=3)break; p=0; f=0; //注意每次归0 for(i=1; i<=n; i++) { if(a[i]==0) continue; else p++; if(p==3) { a[i]=0; f+=1; p=0; } } q=q-f; } p=0; for(int i=1; i<=n; i++) { if(a[i]==0) continue; else { p+=1; if(p==q) cout<<a[i]<<endl; else cout<<a[i]<<" "; } } } return 0; }
这个才是正确的,错误的地方有标记
#include<iostream> using namespace std; int main() { int i,t,n,p; int a[5100]; cin>>t; while(t--) { int q;//定义整型变量,n赋值给q cin>>n; q=n; for(i=1; i<=n; i++) a[i]=i; while(q>3) //判断条件 { int f=0;//这里!! p=0; for(i=1; i<=n; i++) { if(a[i]==0) continue; else p++; if(p==2) { a[i]=0; f+=1; //统计出列士兵个数 p=0; } } q=q-f; if(q<=3)break; p=0; f=0; //注意每次归0 for(i=1; i<=n; i++) { if(a[i]==0) continue; else p++; if(p==3) { a[i]=0; f+=1; p=0; } } q=q-f; } p=0; for(int i=1; i<=n; i++) { if(a[i]==0) continue; else { p+=1; if(p==q) cout<<a[i]<<endl; else cout<<a[i]<<" "; } } } return 0; }
参考小云博客:链表使用,与模拟还是很相像的
#include"iostream" #include"list" using namespace std; int main() { int T; cin>>T; while(T--) { int n; cin>>n; list<int> s; if(n==0) cout<<0<<endl; else { for(int i=1; i<=n; i++) s.push_back(i); list<int>::iterator it,ip;//链表遍历迭代器 int f=1; int flag=s.size(); while(flag>3) { for(it=s.begin(); it!=s.end();) { if(f==2) { f=1; ip=it; it++; s.erase(ip); //抹除操作 flag--; } else { f++; it++; } } f=1; if(flag<=3) break; for(it=s.begin(); it!=s.end();) { if(f==3) { f=1; ip=it; it++; s.erase(ip); flag--; } else { f++; it++; } } f=1; if(flag<=3) break; } int w=0; for(it=s.begin(); it!=s.end(); it++) { cout<<(*it); //注意输出格式 w++; if(w<=flag-1) cout<<' '; } cout<<endl; } } return 0; }