杭电1969 pie

时间:2022-07-24
本文章向大家介绍杭电1969 pie,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题意:就是一群有洁癖并且斤斤计较的朋友来做客,你有n块蛋糕,每块有不同的半径r,然后你要给他们包括你自己分到体积相等的蛋糕,并且不能是两块或者以上的蛋糕拼接而成的!

思路:记得有个牛客训练营1有个二分题,但是当时都没看出来,所以想着在复习一下二分,当初理解也不深刻。

回归正题,那么怎个分蛋糕呢?!!表面看上去好像无从下手,当初刚接触编程的我也是如此,现在竟然能很顺畅的一发AC了,说明能力还是有提升的!

我们可以这样想,分蛋糕的话,每块输入时我们对其处理,等到r的平方并且找到最大值!因为蛋糕要分的话,体积肯定是要位于0到最大值之间的,然后我们得到这个区间后,我们可以不停的将其缩小找到符合的值,条件当然是满足m+1个人了!!如果最后分的蛋糕的数量是大于m+1的那么就说明体积小了,我们要把蛋糕在分的大一些!否则说明体积大了,分的小一点!那么在满足这个条件的情况下,在精度达到一定条件即可认为得到符合体积(1e-5好像就后够了)

AC代码如下

#include<bits/stdc++.h>
#define PI acos(-1.0)
#define eps 1e-7
#define inf 0x3f3f3f3f
using namespace std;

double a[10004];
double mid;
int num;
int n,m;
double maxn;
double minn;
int main(){
	int t;
	cin>>t;
	while(t--){
		cin>>n>>m;
		m = m+1;
	    maxn = -1;
		for(int i=0;i<n;i++){
			cin>>a[i];
			a[i] = a[i]*a[i];
			if(a[i]>maxn) maxn = a[i];
		}
	    minn = 0;
		while(maxn - minn > eps){
			mid = (maxn+minn)/2;
			num = 0;
			for(int i=0;i<n;i++){
				num += (int)(a[i]/mid);
			}
			if(num >= m) minn = mid;
			else  maxn = mid;
		}
		printf("%.4lfn",mid*PI);
	}
	return 0;
}