hdu1969(二分思想灵活应用)(附带详细思路)

二分思想不仅仅用于二分查找哦,本题感觉难在理解题意。需要注意的是,饼的所以饼的体积取值应该是0到max间任意值,因为蛋糕不能拼凑可以多余,深入的想想就知道分到蛋糕最大的情况应该是找到一个极值,然后部分蛋糕根本不需要用上,部分蛋糕会有多余。想到这个后这个体积极值就顺利成章要用二分求了,因为没有具体的元素个数,耿直的顺序查找来求极值的方法用不了的。 我一开始是想枚举所有将蛋糕完整分给每个人的情况,相信大多数同志也是跳的这个坑,这样做其实是不会比正确解法分得的蛋糕多的,相信你对比下就知道了。

#include <iostream>
#include <stdio.h>
#include<math.h>
#define pi acos(-1.0)//准确定义Π的值
using namespace std;
/*思路是对0到max二分查找,根据大小算人数,人数与f+1比较后改变查找边界
因为蛋糕不能拼凑可以多余,所以饼的体积取值应该是0到max间任意值,一开始我没有注意到这点。。
所以不能枚举要二分查找逼近那个值
*/
int main()
{int n,t,f,i,r,pep;
    double s[10005];
    double max,min,mid;
    scanf("%d",&t);//测试用例数
    while(t--)
    {
        min=0;max=0;
        scanf("%d%d",&n,&f);
        f++;
        for(i=1;i<=n;i++)
            {
            scanf("%d",&r);
            s[i]=pi*r*r;
            if(max<s[i]) max=s[i];
            }
        while(max-min>1e-7)
        {   pep=0;
            mid=(max+min)/2;
            for(i=1;i<=n;i++)
            pep+=(int)(s[i]/mid);//s【i】/mind一定要有括号,才是对整体强制转换
            if(pep>=f)
                min=mid;
            else max=mid;
        }
        printf("%.4lf\n",mid);

    }


}
发布了30 篇原创文章 · 获赞 5 · 访问量 6942

猜你喜欢

转载自blog.csdn.net/weixin_44735312/article/details/90954368