题号 NC23049 名称 华华给月月准备礼物

华华给月月准备礼物

http://www.nowcoder.com/questionTerminal/9963334321e64e61a397b262708e4f65

题意:给出n个长度,问你分成k个长度相同的小木棍的最大长度?

比如:
5 10
4 4 4 5 3

如果长度为2,只能得到2+2+2+2+1=9根,不够;长度为1可以得到4+4+4+5+3=20根,足够。所以答案最大是1。

可以看到枚举每一个可能的值是超时的,想到二分,那么就可以得到下面的代码。
可以优化?或许加个排序,然后再判断的条件加个提前return的语句可以剪枝吧,但是排序也需要时间,这点看个人所需吧。

#include <bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define db printf("where!\n");
#define pb push_back
using namespace std;
#define ll long long
ll gcd(ll x,ll y){return y ? gcd(y,x%y) : x;}
template<class T>inline void read(T &res){
char c;T flag=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
int n,k;
int a[200005];
bool kk(int b)
{
    ll num=0;
    for(int i=1;i<=n;i++) num+=a[i]/b;
    if(num>=k) return 1;
    else return 0;
}
int main()
{
    read(n),read(k);
    for(int i=1;i<=n;i++) read(a[i]);
    int l=0,r=1e9;
    while(l<r){
        int mid=(l+r+1)/2;
        if(kk(mid)) l=mid;
        else r=mid-1;
    }
    cout<<l;
    return 0;
}
全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务