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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值