寒假Day40:HDU1267-士兵训练问题-暴力
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 Sample Input 2 20 40 Sample Output 1 7 19 1 19 37
其实感觉从这一题上看,自己的代码能力还是很弱,
就类似于约瑟夫环问题,
一些问题没法很顺畅的从脑子里表达出来,
按理说类似这种题目应该很快敲出来,但是我没有。
好好反思这段时间的行为吧,
要对自己负责。
这一题还可以用队列写,但是我写了,但是答案不对,网上的我也没看懂。
AC代码:(暴力)
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<stack> #include<queue> using namespace std; bool book[5050]; int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(book,0,sizeof(book)); int q=n,flag=0; while(q>3) { int p=0; for(int i=1; i<=n; i++) { if(book[i]==0) { p++; if((flag==0&&p%2==0)||(flag&&p%3==0)) { book[i]=1; q--; } } } if(flag) flag=0; else flag=1; } printf("1"); for(int i=2; i<=n; i++) { if(book[i]==0) printf(" %d",i); } printf("\n"); } return 0; }