题目描述:
约翰家的 N 头奶牛要参加跳舞演出。舞台能支持 K 头奶牛同时跳舞,每头奶牛都有一个跳舞的时长 di。初始时编号为 1~K 的奶牛同时登台跳舞,每当一头奶牛结束它的舞蹈,下一头奶牛就会立刻登台跳舞。现要求演出总时间不超过 T,求 K 的最小值。
输入格式:
第一行输入两个正整数 N 和 T。
第二行输入 N 个正整数,第 i 个正整数为 di。
输出格式:
一行一个正整数,表示 K 的最小值。
样例输入1:
5 8
4 7 8 6 4
样例输出1:
4
样例输入2:
5 8
2 3 3 3 3
样例输出2:
2
样例输入3:
7 100
1 23 88 3 2 77 25
样例输出3:
3
数据规模:
1≤N≤10000,1≤T≤1000000,1≤di≤100000。
保证 K=N 时表演会按时完成。
AC代码如下:
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<iostream>
#include<algorithm>
#pragma GCC optimize(2)
#pragma G++ optimize(2)
using namespace std;
int n,t,a[100005];
priority_queue<int,vector<int>,greater<int> >q;
bool ch(int i)
{
int j=1,bowl=0;
for(j;j<=i;j++)
q.push(a[j]);
while(j<=n&&bowl<=t){
bowl+=(q.top()-bowl);
q.pop();q.push(a[j++]+bowl);
}while(!q.empty()){
bowl+=(q.top()-bowl);
q.pop();}return bowl<=t;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);cin>>n>>t;
for(int i=1;i<=n;i++)
cin>>a[i];
int l=1,r=n,m;
while(l<r)
{
m=(l+r)/2;if(ch(m))
r=m;else l=m+1;
}cout<<r;return 0;
}