POJ3122 Pie

36 篇文章 0 订阅

这题也是二分穷举的思路。

上下界调整不能mid+1或mid-1了,这样会损失精度。因为不是整型。

还有就是浮点数的相等比较不能像整型那样用==,还是设置一个逼近区间比较好。如

while(high-low>1e-5)

不然的话,是有可能无限循环的。

或者在每次调整上下界的时候进行微调,如

while(low<high){
		double mid = (low+high)/2;
		if(valid(mid))
			low = mid+1e-5;
		else
			high = mid-1e-5;
	}



#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

#define PI 3.14159265359

int N,F;
double V[10000];
double low,high;

bool valid(double mid){
	int count = 0;
	for(int i=0;i<N;++i){
		count += (int)(V[i]/mid);
	}
	return count >= F+1;
}

void process(){
	while(high-low>1e-5){
		double mid = (low+high)/2;
		if(valid(mid))
			low = mid;
		else
			high = mid;
	}
	printf("%.4f\n",low*PI);
}

int main(){
	int t;
	double r;
	double sum;
	cin>>t;
	while(t--){
		cin>>N>>F;
		sum = 0;
		for(int i=0;i<N;++i){
			cin>>r;
			V[i] = r*r;
			sum += V[i];
		}
		low = 0;
		high = sum/(double)(F+1);
		process();
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值