注:最近这一系列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;
}