JNUOJ 1032 - 食物處理器

 
小明喜歡把土豆塊放在食物處理器中處理。長度不超過H的土豆塊放入處理器中,處理器每秒處理長度爲k(即土豆塊長度減小k)。若是土豆塊長度小於k,土豆塊會被徹底處理掉。
 
小明有n塊土豆,第i塊土豆的長度爲ai 。小明把這些土豆塊一塊一塊地從編號1到n地放入處理器中。每秒鐘處理器中都發生着如下事情:
 
若是有至少一塊剩餘的土豆,小明一個接一個地把土豆塊放在處理器中,直到沒有足夠的空間放下一塊。
 
Input
第一行n, h , k (1≤n≤100?000,1≤k≤h≤10^9)
 
第二行n個ai (1≤ai≤h)
 
Output
處理完全部土豆花費的時間
 
Sample Input
5 6 3
5 4 3 2 1
5 6 3
5 5 5 5 5
5 6 3
1 2 1 1 1
 
Sample Output
5
10
2
 
 
 
對題目加一點描述(我會說我第一次看這個題目愣是沒看懂???):只有一個處理器,每時每刻都在處理,處理完的部分長度就消失了,空出來的長度可以放得下下一個,就能夠放新的,小明放土豆的時間趨於零。
 
考慮的狀況就是兩步反覆循環:
①先把從當前位置開始,把全部能放的進去的土豆都放進去。
②機器處理一下,同時計算一下耗時。
 
可是值得注意的是,本體的時間限制,以下的代碼是會超時的:
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int n,h,k,p[100005];
 5     while(scanf("%d %d %d",&n,&h,&k)==3){
 6         int i,time=0,ct=0;
 7         for(i=0;i<n;i++) scanf("%d",&p[i]);p[i]=0;
 8         ct=p[i=0];//先把第一個土豆放進去
 9         while(i<n){
10             while(ct+p[i+1]<=h && p[i+1]!=0) ct+=p[++i];//
11             ct-=k;if(ct<0) ct=0;time++;//處理器處理一秒
12             if(i==n-1&& ct==0)break;//判斷是否是土豆已經被徹底處理完
13         }
14     printf("%d\n",time);
15     }
16 }

 

由於n能夠很大,若是每次只處理掉1秒的(呱),那麼循環次數太多就太慢。
於是要把「 處理器處理一秒」改做②:
 1 #include<stdio.h>
 2 int main()
 3 {
 4     int n,h,k,p[100001];
 5     while(scanf("%d %d %d",&n,&h,&k)!=EOF){
 6         int i,time=0,ct=0;
 7         for(i=0;i<n;i++) scanf("%d",&p[i]);p[i]=0;
 8         ct=p[i=0];
 9         while(i<n){
10             while(ct+p[i+1]<=h && p[i+1]!=0) ct+=p[++i];//
11 if(ct>k){time+=ct/k;ct%=k;}
12             else{ct=0;time++;}           //②處理器處理多秒
13             if(i==n-1&& ct==0)break; //判斷是否是土豆已經被徹底處理完
14 }
15     printf("%d\n",time);
16     }
17 }

感受好像也是有那麼點貪心思想的……php

相關文章
相關標籤/搜索