AtCoder Beginner Contest 174 E - Logs

 

 

 

 

题意 :给你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;
}

 

posted @ 2020-08-03 15:42  摸鱼选手LLF  阅读(181)  评论(0编辑  收藏  举报