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     }
 
 

 



转载于:https://www.cnblogs.com/lyqlyq/p/6890919.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值