tyvj1938 最优战舰

描述

太空战队顺利地完成了它的第一次使命,这一行动的受益者陆军本部当即决定,请陆军的战士们投票选出最优战舰并报司令总部进行表彰。
为防止有人利用高科技手段造假,陆军本部决定使用最原始的方法进行投票。可不幸的是,陆军的战士正在N个不同的地点执行任务,第i个地点有a[i]名战士参加投票。按照规定,票箱的数量是有限的M(M>=N)个,每个票箱的容量必须完全相同。显然,分配给每个选区的票箱总容量不能比选区的战士数目少。不幸中的万幸,票箱的容量C是可以任意规定的。
陆军本部需要你的帮助来合理地把这M个票箱分给N个不同的选区。为节约成本,你需要在满足每个“选区”投票需求的同时使得每个票箱的容量能够尽量地小。

输入格式

第一行两个整数N、M,表示选区的个数和票箱的个数。
接下来N行每行1个整数,第i+1行的整数a[i]表示第i个选区参与投票的士兵数。

输出格式

一行一个整数C,表示在能够满足选举需求的情况下的最小票箱容量。

测试样例1

输入

2 7 
200000 
500000

输出

100000

备注

分配给第1个选区2个票箱,第2个选区5个票箱即可。
对于30%的数据,N<=1000, M<=1000, a[i]<=1000.
对于100%的数据,0<N<=100000, 0<M<=1000000, 0<=a[i]<=10000000.
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1000005;
int n,m,a[maxn];
bool check(int t){
    int ans = 0,tmp;
    for(int i = 1;i <= n;i++){
        tmp = a[i] / t;
        if(tmp * t < a[i]) tmp++;
        ans += tmp;
        if(ans > m) return false;
    }
    return true;
}
int main(){
    cin>>n>>m;
    int l = 0,r = 0,mid,ans;
    for(int i = 1;i <= n;i++){
        scanf("%d",&a[i]);
        if(a[i] > r) r = a[i]; 
    }
    while(l <= r){
        mid = (l + r) >> 1;
        if(check(mid)){
            ans = mid;
            r = mid - 1;
        }else{
            l = mid + 1;
        }
    }
    cout<<ans;
    return 0;
}

 

posted @ 2016-08-20 22:41  ACforever  阅读(464)  评论(0编辑  收藏  举报