注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。
厌倦了无休止的北邮的工作后,房教决定着手MP3播放器市场推出他的新iCow。这是一款MP3播放器能储存N(1<=N<=1,000)首歌乱序,从1到N进行编号,这是由房教自己的算法所决定的:
每一首歌曲i都有一个初始等级Ri(1<=Ri<=10,000)。
下一首将要被播放的歌曲总是等级最高的那一首(如果出现等级相同的情况,选择标号较小的)。
歌曲被播放之后,这首歌的等级将被设置成0,并且,他原来的等级值将被分配给所有其他的N-1首歌。
如果等级值不能平均的分配(即,不能被N-1整除),假设分配完后还剩余k分,那么多出的等级值将被按照标号从小到大分配给其它的k首歌曲,每个一分,(即,第一首,第二首,等等)——刚播放过的歌曲除外,直到没有多出的分数剩余为止。
这个过程一直重复。
试决定iCow最先播出的T(1<=T<=1000)首歌。
Input
多组数据测试 每组数据第一行是两个整数N和T
后面N+1行,第i+1行包行一个整数Ri,表示标号为i的歌曲等级为Ri
输入的最后以两个0结束,这组数据不用处理
Output
每组数据输出T行,第i行输出一个整数,表示iCow播放第i首歌的编号。
Sample Input
3 4
10
8
11
0 0
Sample Output
3
1
2
3
Source
模拟题
#include <iostream> using namespace std; int main() { int song[1001]; int N, T; int a, b, c; cin >> N >> T; while (N || T) { for (int i = 1; i <= N; i++) { cin >> song[i]; } if (N == 1) for (int j = 1; j <= T; j++) cout << N << endl; else{ for (int j = 1; j <= T; j++) { int max = 1; for (int i = 2; i <= N; i++) { if (song[max] < song[i]) max = i; } cout << max << endl; a = song[max] / (N - 1); b = song[max] % (N - 1); for (int i = 1; i <= N; i++) song[i] += a; song[max] = 0; c = 1; if (b != 0) { while (b--) { if (c == max) c++; song[c] += 1; c++; } } } } cin >> N >> T; } system("pause"); return 0; }