1. 程式人生 > >cogs 142. [USACO Jan08] iCow播放器 ???

cogs 142. [USACO Jan08] iCow播放器 ???

con open i+1 限制 清零 stream get 如果 etc

☆ 輸入文件: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     }



cogs 142. [USACO Jan08] iCow播放器 ???