1. 程式人生 > 其它 >牛客IOI周賽22-普及組 戰爭尾聲 (c++)

牛客IOI周賽22-普及組 戰爭尾聲 (c++)

技術標籤:牛客IOI周賽22-普及組c++acm競賽演算法模擬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; }

附:初來乍到,如果有不足之處,懇請各位大牛指正,如果題解有錯誤或者沒寫清楚的地方也歡迎在評論區提問~