暴力破解,二分查找,派

题目

暴力破解,二分查找,派_第1张图片
提示:本人也要留一块派

大致考点(个人认为)

1.暴力破解:个人感觉找不出规律,就只能设派的面积为多少来进行计算出能不能分够给所有人(包括自己)。
2.二分搜索:因为精确度为3位小数,所以当计算派的面积的区间小于0.0001的时候肯定不会影响到搜索的结果,但是0.0001的大小如果用依次遍历就太慢了,所以用二分搜索的形式,搜索至区间小于0.0001为止。
3.搜索的范围应该从 最大的一块/人数面积之和/人数 之间开始搜索,可以减少搜索的范围

代码

#include 
#include 
using namespace std;
int main()
{
    double person, length, median;
    double area[10000], Pi = 3.1415926, num, min_area = 0, max_area = 0;//min_area与max_area用来记录区间的上下界
    cin >> length;
    cin >> person;
    person++;//加上自己的那块
    for(int tmp = 0; tmp < length; tmp++)//输入派的半径,计算出面积之和和最大值
    {
        cin >> num;
        area[tmp] = num*num;
        max_area += area[tmp];
        if(area[tmp] > min_area)
            min_area = area[tmp];
    }
    max_area /= length;
    min_area /= length;
    int num1;//用来标记在每块大小为median的情况下,能分给多少人
    while(max_area - min_area > 0.00001)//区间小于0.0001的时候,就是答案
    {
        median = (max_area + min_area)/2;
        num1 = 0;
        for(int tmp = 0; tmp < length; tmp++)//遍历存有面积的数组,计算能分成多少块面积为median的派
            num1 += (int)(area[tmp]/median);
        if(num1 < person)//如果不够分,那就是派的面积大了,通过减少上届,来缩小median
            max_area = median;
        else//如果够分,那就是派的面积小了,通过增大下届,来放大median
            min_area = median;
    }
    cout << fixed << setprecision(3) <

个人感觉

中规中矩的二分搜索,但是,谁能有1000000个朋友,快说,谁能有o(一︿一+)o

你可能感兴趣的:(C++)