题意 :给你N个木头,长度分别是ai
让你切K次,
切完后,让你求长度最大的木头最小值,(最大值最小)
题解
考虑一个value ,我切K次能不能保证所有木头都小于value
一个木块的长度为len,那切完后小于等于value,就需要 (len-1)/value 次 (上取整-1,手玩一下想想)
所以二分一下找一下这个value就行了
#include<bits/stdc++.h> #define pb push_back #define fi first #define se second #define io std::ios::sync_with_stdio(false) using namespace std; typedef long long ll; typedef pair<int,int> pii; const int P = 1e9+7, INF = 0x3f3f3f3f; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int qpow(int a,int n) { int r=1%P; for (a%=P; n; a=a*a%P,n>>=1)if(n&1)r=r*a%P; return r; } const int maxn=2e5+50; int a[maxn]; int n,k; int check(int x) { int kk=0; for(int i=1;i<=n;i++) { kk+=(a[i]-1)/x; } if(kk>k) return 0; else return 1; } int main() { cin>>n>>k; for(int i=1;i<=n;i++) { cin>>a[i]; } int l=1,r=1e9; int ans=0; while(l<=r) { int mid=(l+r)/2; if(check(mid)) { r=mid-1; ans=mid; } else { l=mid+1; } } cout<<ans<<endl; }