YTU2897:E--外星人供给站 C++ 贪心

目录

​编辑

题目描述

输入

输出

输入输出样例

样例输入

样例输出

代码C++


题目描述

外星人指的是地球以外的智慧生命。外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本形式的认识。比如,我们所知的任何生命都离不开液态水,并且都是基于化学元素碳(C)的有机分子组合成的复杂有机体。

42 岁的天文学家 Dr. Kong 已经执著地观测 ZDM-777 星球十多年了,这个被称为“战神”的红色星球让他如此着迷。在过去的十多年中,他经常有一些令人激动的发现。ZDM-777 星球表面有着明显的明暗变化,对这些明暗区域,Dr. Kong 已经细致地研究了很多年,并且绘制出了较为详尽的地图。他坚信那些暗区是陆地,而亮区则是湖泊和海洋。他一直坚信有水的地方,一定有生命的痕迹。Dr. Kong 有一种强烈的预感,觉得今天将会成为他一生中最值得纪念的日子。

这天晚上的观测条件实在是空前的好,ZDM-777 星球也十分明亮,在射电望远镜中呈现出一个清晰的暗红色圆斑。还是那些熟悉的明暗区域和极冠,不过,等等,Dr. Kong 似乎又扑捉到曾看到过的东西,那是什么,若隐若现的。他尽可能地睁大了眼睛,仔细地辨认。哦,没错,在一条直线上,又出现了若干个极光点连接着星球亮区,几分钟后,极光点消失。

Dr. Kong 大胆猜想,ZDM-777 星球上的湖泊和海洋里一定有生物。那些极光点就是 ZDM-777 星球上的供给站,定期给这些生物提出维持生命的供给。
不妨设,那条直线为 xxx 轴,极光点就处在 xxx 轴上,NNN 个亮区 P1,P2,…,PNP_1, P_2, \dots, P_NP1​,P2​,…,PN​ 就分布在若干个极光点周围。 

接着,Dr. Kong 又有惊人的发现,所有的亮区 PiP_iPi​ 都处在某个半径为 RRR 的极光点圆内。去掉一个极光点就会有某些亮区 PjP_jPj​ 不处在覆盖区域内。

Dr. Kong 想知道,至少需要多少个极光点才能覆盖所有的湖泊和海洋。

输入

第一行:KKK 表示有多少组测试数据。

接下来对每组测试数据:

第 111 行:N,RN, RN,R

第 2−N+12 - N+12−N+1 行: Pxi,PyiP_{xi}, P{yi}Pxi​,Pyi (i=1,2,…,N)(i = 1, 2, \dots, N)(i=1,2,…,N)

2≤K≤5,1≤R≤50,1≤N≤100,−100≤Pxi,Pyi≤100,∣Pyi∣≤R2 \le K \le 5, 1 \le R \le 50, 1 \le N \le 100, -100 \le P_{xi}, P{yi} \le 100, |P_{yi}| \le R2≤K≤5,1≤R≤50,1≤N≤100,−100≤Pxi​,Pyi≤100,∣Pyi​∣≤R, R,Pxi,PyiR, P_{xi}, P_{yi}R,Pxi​,Pyi​ 都是整数。数据之间有一个空格。

输出

对于每组测试数据,输出一行: 最少需要的极光点数。

输入输出样例

样例输入

2
3 2
1 2
-3 1
2 1
1 5
5 5

样例输出

2
1

代码C++

#include<bits/stdc++.h>
#include<math.h>
using namespace std;
int node=1;
int tt;

struct sb
{
	float x,y;
	float x1,x2;//距离	
}island[1001];

bool cmp(sb a,sb b)
{
	return a.x1<b.x1;
}

int main()
{
	int n,d,t;
	int i;
	cin>>tt;
	while(tt--)
	{
		cin>>n>>d;
		int selected=0;
		if(n==0||d==0)
			return 0;
		t=d*d;
		int ans=1;
		for(i=0;i<n;i++)
		{
			scanf("%f%f",&island[i].x,&island[i].y);
			island[i].x1=island[i].x-sqrt(t-island[i].y*island[i].y);
			island[i].x2=island[i].x+sqrt(t-island[i].y*island[i].y);
			if(island[i].y>d)
				selected=1;
		}
		sort(island,island+n,cmp);
		float l=island[0].x1,r=island[0].x2;
		for(i=1;i<n;i++)
		{
			if(island[i].x1>r)
			{
				ans++;
				l=island[i].x1;
				r=island[i].x2;
			}
			else
			{
				l=island[i].x1;
				if(island[i].x2<r)
					r=island[i].x2;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

幸福程序你会编写,快乐描绘在生活里;烦恼程序你会删除,心情保持时刻美丽;忧伤程序你会卸载,生活保持顺顺利利;幸福程序员就是你,在这属于你的节日里,愿你好运一直运行下去,生活事业都如意!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值