题目描述
After several months of rehearsal, the cows are just about ready to put on their annual dance performance; this year they are performing the famous bovine ballet "Cowpelia".
The only aspect of the show that remains to be determined is the size of the stage. A stage of size KKK can support KKK cows dancing simultaneously. The NNN cows in the herd (1≤N≤10,0001 \leq N \leq 10,0001≤N≤10,000) are conveniently numbered 1…N1 \ldots N1…N in the order in which they must appear in the dance. Each cow iii plans to dance for a specific duration of time d(i)d(i)d(i). Initially, cows 1…K1 \ldots K1…K appear on stage and start dancing. When the first of these cows completes her part, she leaves the stage and cow K+1K+1K+1 immediately starts dancing, and so on, so there are always KKK cows dancing (until the end of the show, when we start to run out of cows). The show ends when the last cow completes her dancing part, at time TTT.
Clearly, the larger the value of KKK, the smaller the value of TTT. Since the show cannot last too long, you are given as input an upper bound TmaxT_{max}Tmax specifying the largest possible value of TTT. Subject to this constraint, please determine the smallest possible value of KKK.
经过几个月的排练,奶牛们基本准备好展出她们的年度舞蹈表演。今年她们要表演的是著名的奶牛芭蕾——“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的最小值。
输入输出格式
输入格式:
The first line of input contains NNN and TmaxT_{max}Tmax, where TmaxT_{max}Tmax is an integer of value at most 1 million.
The next NNN lines give the durations d(1)…d(N)d(1) \ldots d(N)d(1)…d(N) of the dancing parts for cows 1…N1 \ldots N1…N. Each d(i)d(i)d(i) value is an integer in the range 1…100,0001 \ldots 100,0001…100,000.
It is guaranteed that if K=NK=NK=N, the show will finish in time.
第一行包括N和T-max两个整数(T-max<=1,000,000)。
接下来的N行给出了第1..n头牛跳舞的持续时间d[1]..d[n]。第i行包括一个整数d[i],1<=d[i]<=100,000.
保证K=N时表演会按时完成。
输出格式:
Print out the smallest possible value of K such that the dance performance will take no more than TmaxT_{max}Tmax units of time.
输出在表演时间不大于T-max时的K的最小可能值。
输入输出样例
5 8 4 7 8 6 4
4
____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
这题用二分,查找 k 的值(先确定 k 的值,再判断 k 是否符合要求,符合要求就缩小范围继续查找,不符合就增大范围继续查找)
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int n,tmax,a[10001],b[10001],t,l=1,r,m; 5 int f(int x) 6 { 7 for(int i=1;i<=x;i++) 8 b[i]=a[i]; 9 sort(b+1,b+x+1); 10 for(int i=x+1;i<=n;i++) 11 { 12 if(b[x]>tmax) 13 return 0; 14 b[1]+=a[i]; 15 for(int j=1;j<x;j++) 16 if(b[j]<=b[j+1]) 17 break; 18 else 19 t=b[j],b[j]=b[j+1],b[j+1]=t; 20 } 21 return b[x]<=tmax; 22 } 23 int main() 24 { 25 cin>>n>>tmax; 26 r=n; 27 for(int i=1;i<=n;i++) 28 cin>>a[i]; 29 while(l<=r) 30 { 31 m=(l+r)/2; 32 if(f(m)) 33 r=m-1; 34 else 35 l=m+1; 36 } 37 cout<<l; 38 return 0; 39 }