木材加工

木材加工

 

Time Limit:   1000MS       Memory Limit:   65535KB
Submissions:   222       Accepted:   63

 

Description
木材厂有一些原木,现在想把这些原木切割成一些长度相同的小段木头(并不是所有原木都一定要用完,可以有剩余),需要得到的小段的数目是给定的。当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段木头的最大长度。木头长度的单位是cm。原木的长度都是正整数,我们要求切割得到的小段木头的长度也是正整数。

 

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

 

Output
输出能够切割得到的小段的最大长度。如果连1cm长的小段都切不出来,输出”0”。

 

Sample Input

 

3 7
232
124
456

 

Sample Output

 

114

 

解析:

这一类题取值时都会用到二分查找的算法,然后就是很卡精度,注意精度就可以了

这道题我还遇到了一个像5.999998的情况,这时需要取6,因此直接强制转换要出问题,做一点处理即可

 

# include<stdio.h>
#define eps 10e-4
int main()
{
    int nWood,nPerson;
    int sign[10005];
    int i,cnt,maxnum=0,res;
    double st,en,mid;
    scanf("%d %d",&nWood,&nPerson);
    for(i=0;i<nWood;i++)
    {
        scanf("%d",&sign[i]);
        if(sign[i]>maxnum)
            maxnum=sign[i];
    }
    st=0.0;
    en=(double)maxnum;
    while(en-st>eps)
    {
    cnt=0;
    mid=(st+en)/2;//折半查找的思想
    for(i=0;i<nWood;i++)
       cnt+=(int)(sign[i]/mid);
    if(cnt<nPerson)
        en=mid;
    else st=mid;
    }
    res=(int)mid;//强制转换后mid值没变
    res=(mid-res)>=0.999?(res+1):res;//会出现像5.999998的情况,这时就取6
    printf("%d\n",res);
    return 0;
}

 

 

 

 

posted on 2013-03-03 16:16  即为将军  阅读(936)  评论(0)    收藏  举报

导航