1 条题解

  • 0
    @ 2023-10-27 20:54:00
    //所需头文件以及全局变量
    #include <stdio.h>
    #include<stdbool.h>
    int n,k;//蛋糕数量以及人数
    double  w[100000];//每个蛋糕的质量
    

    本题核心思想是利用二分求出蛋糕可利用的极限质量

    int sum=0;//所有蛋糕质量和
    	for(int i=0;i<n;i++)
    	{
    		scanf("%lf",&w[i]);
    		w[i]*=100;
    		sum+=w[i];
    	}
    int ex=sum/k;
    //在无舍去情况下最大单个蛋糕质量
    

    因为精度问题本题不建议使用浮点二分,所以通过将所有质量乘以100以转化成整数。

    int l=0,r=ex;
    /*l为左端点,r为右端点。
    因为结果为小数,且蛋糕质量乘过100
    输出时需除以‘100.0’
    输出类型为double,即‘.2lf’保留两位小数*/
    

    因为ex为未舍去质量,所求质量小于等于ex,所以右端点r可以定义为ex.

    while(l<=r)
    //进行二分,l为左端点,r为右端点
    	{
    		int mid=(l+r)/2.0;//取中点
    //check函数用于判断蛋糕是否够分		
    if(check(mid))
    		{
    			l=mid+1;
    //加一是为了跳出循环,结果输出时需手动减一
    		}
    		else
    		{
    			r=mid-1;
    		}
    	}
    

    最后答案输出左端点l即可

    • 1

    信息

    ID
    793
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    512
    已通过
    19
    上传者