标签:代码 不能 turn scanf blog 超过 open 特定 push
题目大意:
经过几个月的排练,奶牛们基本准备好展出她们的年度舞蹈表演。今年她们要表演的是著名的奶牛芭蕾——“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); }
标签:代码 不能 turn scanf blog 超过 open 特定 push
原文地址:http://www.cnblogs.com/ghostfly233/p/7050535.html