UVA144 Student Grants 题解

  1. 1. Solution
  2. 2. code

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;
}