前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >杭电1969 pie

杭电1969 pie

作者头像
杨鹏伟
发布2020-09-11 00:07:26
2960
发布2020-09-11 00:07:26
举报
文章被收录于专栏:ypw

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

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

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

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

AC代码如下

代码语言:javascript
复制
#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("%.4lf\n",mid*PI);
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/02/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档