您的位置:首页 > 其它

1003 Pie

2016-04-12 17:47 148 查看
题意:

有n个披萨,f个朋友,给出披萨的半径,然后分饼,每个人的都要一样大 而且不能两块披萨拼成一块披萨;求每人分到的最大;输入是第一行表示n个数据 第二行第一个是披萨数量 第二个是人数,第三行是披萨的半径。

思路:

注意也要分给自己。

先求出总的面积 不考虑披萨不能合成 求出最大的面积 然后定义一个函数判断每个披萨减去最大面积的n倍 把所有的n加起来是否比人数多 如果比人数多 返回true 否则返回0;

用二分法定义左右数值分别为0和最大面积如果右边减左边的精度不符合 每人分到的最大就是(左+右)/2 然后判断披萨够不够 如果够 每人分到的最大复制给左 如果不够分给右 循环直到精度符合要求

输出注意格式。

#include <iostream>
#include <cmath>
#include<string.h>
#include<iomanip>
using namespace std;
double pi = 3.1415926535898;
double EPS = 0.00001;
double pie[10001];
bool test(int b,int c,double mid)
{
int sum = 0;
for (int j, i = 0;i < b;i++)
{
for (j = 0; ;j++)
{
if (pie[i] - j*mid > 0)continue;
else break;
}
sum += --j;
}
if (sum >= c) return 1;
else return 0;
}
int main()
{
int a;
cin >> a;
while (a--)
{
memset(pie, 0, 10001);
int b = 0,c=0;
cin >> b>>c;
c++;
double min = 100000*pi;
double sum = 0;
for (int i = 0;i < b;i++)
{
cin >> pie[i];
pie[i] *= pi*pie[i];
sum += pie[i];
if (min > pie[i]) min = pie[i];
}
double mid ,h= sum / c,l=0;
mid = h;
//cout << "min" << min << " " << "mid" << mid << endl;
while ((h-l)>EPS)
{
mid = (l + h) / 2;
if (test(b, c, mid)) l = mid;
else h = mid;
}
cout << setprecision(4) << setiosflags(ios::fixed) << mid << endl;

}
return 0;
}


虽然用了很长时间思考和编译 但是 一遍就A的感觉就是爽阿 爽的扣脚!!!不用面对各种CE WA就是爽!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: