今晚把我搞自闭了,一直WA的一道题
在秃头的道路上一去不复返。
太搞我心态了。(碎碎念碎碎念)
题目链接:Pie-HDU 1969
大体意思就是你有N块派,要平均分给F个朋友和自己,求最大体积。
在这里我们就可以使用二分啦!
当你的中间取值都满足条件时,说明比它小的都满足条件,那么此时下界就变为中间取值,当中间取值不满足条件时,说明比它大的都不满足条件,那么这时候上界就变为中间取值。
由于题目输入给的是派的半径,因此我们需要转化为体积(高为1,面积就是体积)。
那么如何判断中间值是否满足条件呢???
求出每个派最多能分的人数(即派的面积除以中间值取整),再将人数相加,比较此时可分得总人数是否大于朋友数加自己(即F+1),若大于则中间值满足条件,更改下界值,反之亦然。
注意将PI放在输出时乘入可提高精度。PI=acos(-1)。
那么来康康搞我心态的 代码
#include<stdio.h>
#include<math.h>
#define PI acos(-1)
#define EPS 1e-6
int main()
{
int m;
scanf("%d",&m);
while(m--)
{
int n,i,f,r;
double s[10000],mid,low=0,high=0;
scanf("%d %d",&n,&f);
for(i=0;i<n;i++)
{
scanf("%d",&r);
s[i]=PI*r*r;
if(high<s[i]) high=s[i];
}
while(high-low>=EPS)
{
mid=(low+high)/2;
int sum=0;
for(i=0;i<n;i++)
{
sum+=(int)(s[i]/mid);
}
if(sum>=f+1) low=mid;
else high=mid;
}
printf("%.4f\n",low);
}
return 0;
}
就这么一个玩意,我WA超多次,是因为在sum+=(int)(s[i]/mid)这一步,我没有加(int)!!!我也不知道为什么不加强制转换就是过不了,也许现在脑子不清醒,嘤嘤嘤。