牛客IOI周赛22-普及组 战争尾声 (c++)

战争尾声

点我跳转原题

“当攻占主城成功的信号弹与敌人的子弹同时射出,信号弹照亮了民众对于和平的渴望与对于未来美好生活的所有畅想,而子弹却击碎了她下去的信念与存在的全部意义。”

“烟花易冷,少佐的生命也是如此,在温暖的光辉中照亮了她那唯有死亡同行的路,而这温柔的光芒也在这满是硝烟的空气中迅速降温、下落,熄灭,直至落回冰冷坚硬的地面上。”

——前言(略过不影响答题)

战火纷飞了二十多年的大陆终于看到了和平的曙光,
在昂榭尔王国、阿斯特赖亚国等几个大国的牵头下,大陆上的所有国家决定握手言和,停战修养。
作为战争结束的标志,需要所有国家签订一个停战协议。
一份完整的停战协议已经由我们的自动手记人偶 薇尔莉特 起草好了,
现在需要各个国家同时在同一个地点签订该停战协议。

在这里插入图片描述

为了和平签订停战协议,你现在需要在这片大陆上,找到一个点,保证该点到所有国家的距离都 “相等”。
PS:答案坐标均为整数
PS:相等:两段距离差值的绝对值小于 10^-4

如果大陆上找不到该点,请输出 War is cruel.

输入描述:
在这里插入图片描述

输出描述:

第一行,输出满足条件的点的坐标,以空格隔开

如果满足条件的点不止一个,请优先输出横坐标 x 较小的点,如果横坐标x 相等,优先输出纵坐标 y 较小的点。

如果满足条件的点不存在,请输出 War is cruel.
PS:答案坐标均为整数

解题思路:

因为是一个200*200的坐标系,所以可以直接遍历坐标系中的每一个点
如果要判断坐标系中每一个点距离的绝对值小于10^-4
那么这个点和第一个国家距离肯定也和其他点的距离相同
那么在遍历每个点时,我们只要先定义一个浮点变量sum1,它的值就是第一个国家和该点的距离
如果sum1和sum2(这个点到其他国家的距离)之差小于10^-4,那么就可以确定这个点为我们所求
同时题目要求x相等的情况下优先输出y较小的
所以我们采用双重for循环

AC代码

#include <cstdio>
#include <cmath>
using namespace std;
int a[201],b[201];
int n;
int Nebula(int x,int y) {
    
    
	double sum1=sqrt((x-a[1])*(x-a[1])+(y-b[1])*(y-b[1]));//这个点到第一个国家的距离
	for(int i=1; i<=n; i++) {
    
    
			double sum2=sqrt((x-a[i])*(x-a[i])+(y-b[i])*(y-b[i]));//这个点到其他国家的距离
			if(abs(sum2-sum1)>=0.0001)//10^-4
				return 0;
		}
	return 1;//在坐标系中abs(sum2-sum1)<0.0001 证明该点为我们所求
}
int main() {
    
    
	scanf("%d",&n); //老规矩 输入数据
	for(int i=1; i<=n; i++) {
    
    
		scanf("%d %d",&a[i],&b[i]);  //输入国家坐标
	}
	for(int i=1; i<=200; i++)
		for(int j=1; j<=200; j++) {
    
    
			if(Nebula(i,j)) {
    
    
				printf("%d %d",i,j);
				return 0; //如果找到点直接结束程序
			}
		}
	printf("War is cruel.");
	//return 0;
}

附:初来乍到,如果有不足之处,恳请各位大牛指正,如果题解有错误或者没写清楚的地方也欢迎在评论区提问~

猜你喜欢

转载自blog.csdn.net/qq_34832548/article/details/113100047