木材加工

来源:互联网 发布:淘宝女中年上衣运动单 编辑:程序博客网 时间:2024/04/23 16:24

题目  

二分的思想 好像也没体现出动归。。。

#include <iostream>#include <cstdio>using namespace std;int wood[10001];int total = 0;int main(){//    freopen("in2.txt","r",stdin);//    freopen("outMy.txt","w",stdout);    int N,K;    scanf("%d%d",&N,&K);    for(int i = 0; i < N; ++i)    {        scanf("%d",&wood[i]);        total += wood[i];//把木头合成一个长木头来看    }    if( K > total)//首先判断K,N是不是合理的数 这里N是可以大于K的。。。因为是要切割成长度相等的K段    {        printf("0\n");        return 0;    }    else if(K == total)//这种情况 只能1cm来切了 直接输出 不用计算    {        printf("1\n");        return 0;    }    else    {        int left = 1, right = total / K; //开始切木头 二分的思想  又端点最大为 total / K        while(true)        {            if(right -left <= 1)            {                right = (left + right) / 2;//right 和left 只相差1的时候 一直按这个mid值在切木头 但是这以后都是一样的结果了 所以强制在这里退出                break;            }            int mid = (left + right) / 2;//            cout<<left<<endl;//            cout<<mid<<endl;//            cout<<right<<endl<<endl<<endl;            int tem = 0;            for(int i = 0; i < N; ++i)                tem += wood[i] / mid;            if(tem < K) //以mid来切木头 不够 说明mid过大            {                right = mid;            }            else if(tem >= K)//够切 甚至超过了要求的K段 说明mid过小 或者刚好可以继续增加mid            {                left = mid;            }        }        printf("%d\n",right);    }    return 0;}


0 0