zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Java
    Java
    Java
    Java
    Java
    Java
    Java
    Java
    JSON
    正则表达式
  • 原文地址:https://www.cnblogs.com/hyfer/p/5791429.html
Copyright © 2011-2022 走看看