题号 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; }