首页 > 代码库 > Cow Dance Show

Cow Dance Show

题目大意:

经过几个月的排练,奶牛们基本准备好展出她们的年度舞蹈表演。今年她们要表演的是著名的奶牛芭蕾——“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