题意:
有一款MP3,叫iCow,里面存储了N(1<=N<=1000)首歌曲,随机播放顺序由以下算法决定。
• 每首歌i有一个初始的Ri(1<=Ri<=10000)• 下首歌总是最高的Ri(如果Ri==Rj && i<j,则选i)
• 一首歌i播放之后,这首歌的Ri=0,并且将这首歌原来的Ri分给其他N-1首歌
• 若Ri不能被N-1整除,则多出的部分Ri%(N-1)将从第1首歌开始一首歌1点(播放的这首歌除外),直到没有多余的点数
每首歌播放完毕都执行以上算法更新Ri
请决定先被播放的T(1<=T<=1000)首歌曲。
输出T行,代表每次播放哪首歌。
思路:
题意难懂,水模拟。
代码:
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
#include"map"
using namespace std;
int r[1234];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=-1)
{
for(int i=1;i<=n;i++) scanf("%d",&r[i]);
if(n==1)
{
while(m--) puts("1");
continue;
}
while(m--)
{
int Max=-1,Maxi=1;
for(int i=1;i<=n;i++)
{
if(r[i]>Max)
{
Maxi=i;
Max=r[i];
}
}
printf("%d\n",Maxi);
int k=r[Maxi]/(n-1),kx=r[Maxi]%(n-1),tt=0;
r[Maxi]=0;
for(int i=1;i<=n;i++)
{
if(i==Maxi) continue;
if(tt!=kx)
{
r[i]++;
tt++;
}
r[i]+=k;
}
}
}
return 0;
}