1. 程式人生 > >Cow Dance Show

Cow Dance Show

出現 分割 特定 準備 編號 clu names max logs

題目大意:

經過幾個月的排練,奶牛們基本準備好展出她們的年度舞蹈表演。今年她們要表演的是著名的奶牛芭蕾——“cowpelia”。

表演唯一有待決定的是舞臺的尺寸。一個大小為K的舞臺可以支持K頭牛同時在舞臺上跳舞。在牛群中的N頭牛(1<=N<=10,000)按照她們必須出現在舞蹈中的順序方便地編號為1..N。第i頭牛計劃跳d[i]的特定持續時間。一開始,第1..K頭牛出現在舞臺上並開始跳舞。當這些牛中的某一頭牛首先完成了她的部分,她會馬上離開舞臺並且第K+1頭牛會出現在舞臺上並開始跳舞。所以,舞臺上總有K頭奶牛在跳舞(直到表演的尾聲,奶牛不夠的時候)。當最後一頭奶牛完成了她的舞蹈部分,表演結束,共花了T個單位時間。

顯然,K的值越大,T就越小。由於表演不能拖太長,你得知了指定T的最大可能值的上限T-max。請根據這個約束,確定K的最小值。

————————————————我是分割線————————————————

這道題。。裸的二分啊,,,

每次把時間最少的一個舞臺從優先隊列中拿出來,然後加上當前數組塞進去就好了,然後check一下。。

但是註意!本題在塞得時候一定要判斷一下當前值加上數組值有沒有超過t_max,否則會WA。。

雖然我不知道這是為什麽,可是自己出數據後就是會掛。。

下面貼代碼

#include<cstdio>
#include<queue>
#define max(a,b) ((a)>(b)?(a):(b))
#include
<vector> using namespace std; int n,t; int a[200005]; int ans; struct cmp1{ bool operator ()(int &a,int &b){ return a>b; } }; priority_queue<int,vector<int>,cmp1>q; bool check(int num){ int tmp; for(int i=1;i<=num;i++)q.push(a[i]); for(int i=num+1
;i<=n;i++){ tmp=q.top(); q.pop(); tmp+=a[i]; if(tmp>t)return false; q.push(tmp); } tmp=0; for(int i=1;i<=num;i++) { int tt=q.top(); q.pop(); } return tmp<=t; } int main(){ freopen("dance.in","r",stdin); freopen("dance.out","w",stdout); scanf("%d%d",&n,&t); for(int i=1;i<=n;i++)scanf("%d",&a[i]); int l=1,r=n; ans=n; while(l<=r){ int mid=(l+r)>>1; if(check(mid))r=mid-1,ans=mid; else l=mid+1; } printf("%d\n",ans); fclose(stdin); fclose(stdout); }

Cow Dance Show