openjudge 木材加工

来源:互联网 发布:旺旺名字是淘宝昵称么 编辑:程序博客网 时间:2024/04/27 16:27

t1776:木材加工

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
1000ms 
内存限制: 
65536kB
描述
木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目是给定了。当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段木头的最大长度。

木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是正整数。
输入

第一行是两个正整数NK(1 ≤ N ≤ 10000, 1 ≤ K ≤ 10000),N是原木的数目,K是需要得到的小段的数目。
接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。
 

输出
输出能够切割得到的小段的最大长度。如果连1厘米长的小段都切不出来,输出"0"。
样例输入
3 7232124456
样例输出
114
来源
NOIP 2004
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int head,tail,mid,n,k,ans,maxn;
int len[10001];
bool pd(int x)
{
int num=0;
for (int i=1;i<=n;i++)
num+=len[i]/mid;
if (num<k)
return false;
else
return true;
}
int main()
{
   scanf("%d%d",&n,&k);
   maxn=0;
   for (int i=1;i<=n;i++)
    {
     scanf("%d",&len[i]);
     if (len[i]>maxn)
       maxn=len[i];
    }
   head=1;
   tail=maxn;
   while (head<=tail)
    {
    mid=(head+tail)/2;
    if (pd(mid))
     {
      head=mid+1;
      if (mid>ans)
      ans=mid;
     }
    else
     tail=mid-1;
    }
   cout<<ans;
   
}//二分答案的思想
0 0
原创粉丝点击