光盘行动

题目:

Alice看到了有很多菜没最后都没有吃完。

本着不浪费的精神,她决定将这些菜打包好分发给各位亲戚带走。
每分钟,Alice可以选择一份菜,填满一个打包盒(如果填不满也不会用其他的菜去补充)。
距离散会还有一段时间,他们希望你计算一下所需打包盒的最小容积
这样既能准时完成所有菜品的打包,也能分成更多份给不同的人。

输入:

第一行是样例个数K(1<=K<=1000)。
每组样例的第一行是剩菜的个数N(1<=N<=1000),可用时间T(1<=T<=1000),保证N<=T。
第二行N个整数,表示每盘菜的剩余量Ai(1<=Ai<=10000)。

3
4 8
3 6 7 11
5 6
30 11 23 4 20
5 9
10 11 12 13 14

输出:

每组样例输出一个数字,即打包盒的最小容量。

4
23
10

#include <stdio.h>
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
const double PI=acos(-1.0);
int n,t;
int s[105];
bool check(int x){
    int cot=0;
    for(int i=0;i<n;i++){
        cot+=s[i]/x;
        if(s[i]%x!=0){
            cot++;
        }
        if(t-cot<n-i-1){
            return false;
        }
    }
    if(cot<=t) return true;
    else return false;
}
int main(){
    int k;
    int l=0,r=0,mid;
    cin>>k;
    for(int i=0;i<k;i++){
        cin>>n>>t;
        memset(s,n,sizeof(s));
        for(int j=0;j<n;j++){
            cin>>s[j];
            r=max(r,s[j]);
        }
        while(l<=r){
            mid=(l+r)/2;
            if(check(mid)){
                r=mid-1;
            }
            else l=mid+1;
        }
        cout<<l<<endl;
    }
}

猜你喜欢

转载自www.cnblogs.com/xusi/p/12333974.html