本文主要是介绍HDU1276 士兵队列训练问题【模拟+vector】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
士兵队列训练问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13025 Accepted Submission(s): 5702
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37
Author
Cai Minglun
Source
杭电ACM集训队训练赛(VI)
问题链接:HDU1276 士兵队列训练问题
解题思路:使用STL的vector进行模拟,使用erase函数要从后往前删除,因此先用一个vector存储要删除的下标位置,然后从后往前进行删除。
AC的C++程序:
#include<iostream>
#include<vector>using namespace std;vector<int>v;
vector<int>id;int main()
{int t,n;scanf("%d",&t);while(t--){scanf("%d",&n);v.clear();for(int i=1;i<=n;i++)v.push_back(i);int d=3;while(v.size()>3){d^=1;id.clear();for(int i=d-1;i<v.size();i+=d)id.push_back(i);for(int i=id.size()-1;i>=0;i--)v.erase(v.begin()+id[i]);}for(int i=0;i<v.size();i++){if(i) printf(" ");printf("%d",v[i]);}printf("\n");}return 0;
}
这篇关于HDU1276 士兵队列训练问题【模拟+vector】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!