Long time no write, Please pass it over!!!
Solution
最近都在刷水题,就看到了这道水题
模拟题,只要读懂都会做qwq
题意即为:一堆学生去取钱,取的钱数按照顺序,成递增的序列,为 元。
取第 次钱的学生将会取到 元。
若是某一个同学取完了 元,则他就会退出取钱的队伍,就是说,取完钱了。
要是取多了前,即取得钱数大于 元,则多出 元的钱给下一个排队的同学,并且下一个同学回到队尾。
举个栗子,
有 个同学,分别取了:
元钱。此时,最前面的同学可以取 元钱,那么钱数就会变为
第一个同学取完了所有钱,将多出来的钱给后面的同学,并离开队伍。
队列就变成了
下一个同学本来要回到队列尾端,但是由于 ,所以他也可以离开队列了。
就变成了
此时,所有同学都可以离开队伍,结束所有过程
所以,就可以枚举每一个同学取的钱数,加上队列模拟,就可以k掉了。
code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include<bits/stdc++.h> using namespace std; struct Node{ int id,w; };
queue<Node> q;
int main() { int n,k; while(cin>>n>>k&&n!=0&&k!=0) { for(int i=1;i<=n;i++) q.push({i,0}); int last=0,count=0; while(!q.empty()) { int now; Node stu=q.front();q.pop();
if(last==0) { count++; if(count>k) count-=k; now=count; } else now=last,last=0;
if(stu.w+now>=40) { last=stu.w+now-40; printf("%3d",stu.id); } else { stu.w+=now; q.push(stu); } } puts(""); } return 0; }
|