C语言Pie问题(二分)

今晚把我搞自闭了,一直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)!!!我也不知道为什么不加强制转换就是过不了,也许现在脑子不清醒,嘤嘤嘤。

发布了22 篇原创文章 · 获赞 1 · 访问量 1056

猜你喜欢

转载自blog.csdn.net/Doro_/article/details/104058121