zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",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     }
    
    
    


  • 相关阅读:
    bzoj1081 [SCOI2005]超级格雷码
    bzoj3790 神奇项链
    bzoj2822 [AHOI2012]树屋阶梯
    bzoj1485 [HNOI2009]有趣的数列
    bzoj1486 [HNOI2009]最小圈
    bzoj2721 [Violet 5]樱花
    POJ 1238 Substrings
    ZOJ Team Formation
    POJ 1459 Power Network
    POJ 1458 Common Subsequence
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/6890919.html
Copyright © 2011-2022 走看看