cogs 142. [USACO Jan08] iCow播放器 ???
☆ 输入文件:icow.in
输出文件:icow.out
简单对比
时间限制:1 s
内存限制:128 MB
被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场 新买的iCow来听些音乐,放松一下。FJ的iCow里存了N(1 <= N <= 1,000)首曲子,按1..N依次编号。至于曲子播放的顺序,则是按一个Farmer John自己设计的算法来决定:
- 第i首曲子有一个初始权值R_i(1 <= R_i <= 10,000)。
- 当一首曲子播放完毕,接下来播放的将是所有曲子中权值最大的那首(如果有两首或多首曲子的权值相同,那么这些曲子中编号最小的那首会被选中)。
- 一首曲子在播放结束后,它的权值会被平均地分给其他N-1首曲子,它本身的权值清零。
- 如果一首曲子的权值无法被平均分配(也就是说,无法被N-1整除),那么被N-1除的余数部分将会以1为单位,顺次分配给排名靠前的曲子(也就是说,顺序为曲目1、曲目2...依次下去。当然,刚播放过的那首曲子需要被跳过),直到多出的部分被分配完。
在选定的下一首曲子播放完毕后,这个算法再次被执行,调整曲子的权值,并选出再接下来播放的曲目。
请你计算一下,按FJ的算法,最先播放的T(1 <= T <= 1000)首曲子分别是哪些。
程序名: icow
输入格式:
- 第1行: 2个用空格隔开的整数:N 和 T
- 第2..N+1行: 第i+1行为1个整数:R_i
输入样例 (icow.in):
3 4 10 8 11
输入说明:
iCow里存了3首曲子,初始权值依次为10,8,11。你的任务是指出它播放的前4首曲子依次是哪些。
输出格式:
- 第1..T行: 第i行为1个整数,表示iCow播放的第i首曲子
输出样例 (icow.out):
3 1 2 3
输出说明:
每一首曲子播放前,三首曲子的权值分别为:
R_1 R_2 R_3 10 8 11 -> 播放 #3 11/2 = 5, 权值余量 = 1 16 13 0 -> 播放 #1 16/2 = 8 0 21 8 -> 播放 #2 21/2 = 10, 权值余量 = 1 11 0 18 -> 播放 #3 ...
有什么问题么,过了5个点,请大佬帮忙看一下
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 5 6 using namespace std; 7 const int N=1010; 8 9 struct node{ 10 int me; 11 int w; 12 }E[N]; 13 14 inline void read(int &x) 15 { 16 char c=getchar(); 17 x=0; 18 while(c<'0'||c>'9')c=getchar(); 19 while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); 20 } 21 22 int main() 23 { 24 freopen("icow.in","r",stdin); 25 freopen("icow.out","w",stdout); 26 int n,t; 27 read(n); 28 read(t); 29 for(int i=1;i<=n;i++) 30 { 31 read(E[i].w); 32 E[i].me=i; 33 } 34 for(int i=1;i<=t;i++) 35 { 36 int Max=-1; 37 int Bl; 38 for(int j=1;j<=n;j++) 39 { 40 if(E[j].w>Max) 41 Max=E[j].w,Bl=j; 42 } 43 44 printf("%d\n",Bl); 45 46 int _=E[Bl].w/(n-1); 47 for(int j=1;j<=n;j++) 48 { 49 E[j].w+=_; 50 } 51 for(int j=1;j<=(E[Bl].w%(n-1));j++) 52 { 53 E[j].w+=1; 54 } 55 E[Bl].w=0; 56 } 57 return 0; 58 }
AC代码:
1 #include<cstdio> 2 using namespace std; 3 int n=0,t=0,number=0; 4 short arr[1001]={0}; 5 int findmx() 6 { 7 int k=0,x=0,xk=0; 8 for(k=0;k<n;k++) 9 { 10 if(arr[k]>x) 11 { 12 x=arr[k]; 13 xk=k; 14 } 15 } 16 return xk; 17 } 18 int main() 19 { 20 freopen("icow.in","r",stdin); 21 freopen("icow.out","w",stdout); 22 int i=0,j=0; 23 scanf("%d%d",&n,&t); 24 number=t-1; 25 for(i=0;i<n;i++) 26 { 27 scanf("%d",&arr[i]); 28 } 29 int mod=0,bus=0; 30 while(n&&t) 31 { 32 i=findmx(); 33 printf("%d\n",i+1); 34 mod=arr[i]%number; 35 bus=arr[i]/number; 36 if(bus) 37 { 38 for(j=0;j<n;j++) 39 { 40 if(j!=i) 41 { 42 arr[j]+=bus; 43 } 44 } 45 } 46 if(mod) 47 { 48 j=0; 49 while(mod) 50 { 51 if(j!=i) 52 { 53 arr[j]++; 54 mod--; 55 } 56 j=(j+1)%n; 57 } 58 } 59 arr[i]=0; 60 t--; 61 } 62 fclose(stdin); 63 fclose(stdout); 64 return (0); 65 }