cogs 142. [USACO Jan08] iCow播放器 ???
阿新 • • 發佈:2017-05-22
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播放器 ???