排队
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
周末了,软件ACM的队员准备玩玩游戏,娱乐一下,CY想了一个好主意,所有队员站成一个圈,从1开始报数,凡是报出指定数字的人要出列,有人出列后,下个人重新从1开始报数。最后一位“幸存者”要给大家表演个节目。由于队员正在不断的壮大,C小加又想知道他是否需要准备表演,请你设计个程序,帮他确定他是否是“幸存者”。
-
输入
- 第一行是n,有n次游戏,第二行是m,x,表示某次游戏有m个人,指定被请出列的数字为x。其中n<100,m<1000 输出
- 最后幸存的那位的原来的号码 样例输入
-
2 10 5 6 4
样例输出
-
3 5
-
-
//AC代码 模拟 效率低 不科学
-
#include <iostream> #include <queue> using namespace std; int main(){ queue<int> q; int t,i,m,x; cin>>t; while(t--){ cin>>m>>x; for(i=1;i<=m;i++){ q.push(i); } int tmp; while(q.size()!=1){ for(i=1;i<x;i++){ tmp=q.front(); q.pop(); q.push(tmp); } q.pop(); } cout<<q.front()<<endl; q.pop(); } return 0; }
//查了资料 这是关于约瑟夫环问题 有递推公式 f[0]=0; f[i]=(f[i-1]+x)%i; -
//AC代码:
-
#include <iostream> using namespace std; int main(){ int t,i,m,x; cin>>t; int f[1001]; while(t--){ cin>>m>>x; f[0]=0; for(i=1;i<=m;i++){ f[i]=(f[i-1]+x)%i; } cout<<f[m]+1<<endl; } return 0; }