首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【南理oj】6 - 喷水装置(一)(贪心)

【南理oj】6 - 喷水装置(一)(贪心)

作者头像
FishWang
发布2025-08-26 19:21:11
发布2025-08-26 19:21:11
8100
代码可运行
举报
运行总次数:0
代码可运行

喷水装置(一)

时间限制: 3000 ms | 内存限制: 65535 KB

难度: 3

描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。

输入 第一行m表示有m组测试数据 每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。 输出 输出所用装置的个数 样例输入

代码语言:javascript
代码运行次数:0
运行
复制
2
5
2 3.2 4 4.5 6 
10
1 2 3 1 2 1.2 3 1.1 1 2

样例输出

代码语言:javascript
代码运行次数:0
运行
复制
2
5

来源 [苗栋栋]原创 上传者 苗栋栋

挺经典的贪心算法的题。

代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
bool cmp(double a,double b)
{
	return a>b;
}
double cal(double x)
{
	double m;
	m=sqrt(x*x-1);
	m*=2;
	return m;
}
int main()
{
	int u;
	int n;		//n个喷水装置
	double r[622]; 
	int ans;
	double d;		//可波及到的边长(大于20时即可完成任务) 
	scanf ("%d",&u);
	while (u--)
	{
		scanf ("%d",&n);
		for (int i=0;i<n;i++)
		{
			scanf ("%lf",&r[i]);
		}
		sort (r,r+n,cmp);		//从大到小排序
		ans=0;
		d=0;
		for (int i=0;i<n;i++)
		{
			d+=cal(r[i]);
			ans++;
			if (d>=20)
				break;
		}
		printf ("%d\n",ans);
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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