単純な仕分け-ミサイルの迎撃

この記事は、「新人クリエーションセレモニー」イベントに参加して、ゴールドクリエーションへの道を歩み始めました。

 トピックの説明:

11年間目立たないようにした後、ある国は新しいミサイル迎撃システムを開発しました。これは、距離がその作動半径を超えないミサイルを首尾よく迎撃することができます。作業半径が0の場合、それとまったく同じ場所でミサイルを迎撃することができます。しかし、ミサイル迎撃システムにもそのような欠陥があります。各システムは、1日に1回しか作業半径を設定できません。1日の使用コストは、すべてのシステムの作業半径の2乗の合計です。

     ある日、レーダーは敵国から入ってくるミサイルを拾いました。システムはまだ実験段階にあるため、2つのシステムのみが稼働しています。現在の要件がすべてのミサイルを迎撃することである場合、その日の最小使用コストを計算します。

説明を入力してください:

最初の行には、スペースで区切られた4つの整数x1、y1、x2、y2が含まれており、2つのミサイル迎撃システムの座標が(x1、y1)、(x2、y2)であることを示しています。

2行目には整数Nが含まれており、ミサイルがN個あることを示しています。次のN行では、各行に2つの整数x、yが含まれ、スペースで区切られ、ミサイルの座標(x、y)を表します。座標は、異なるミサイルで同じである可能性があります。

出力の説明:

出力は、その日の最小使用コストである整数を含む1行のみです。

例:

入力:

出力:

説明:

入力:

出力:

説明:

述べる:

間違った考え:このトピックを最初に見たとき、私はすぐに2つのアレイAとBを使用して、各ミサイルと2つのシステム間の距離を節約することを考えました。つまり、ミサイルがBシステムよりもAシステムに近い場合は逆に、r1をAに保存すると、r2はBに格納され、Aの最大のBが加算されます。2つの例のデータはなくなっていますが、wa、考え方が間違っているため、一部の状況が考慮されておらず、データが複雑です。


答え:

    この質問は、ミサイルの座標と2つのシステムr1、r2までの距離の二乗を格納する構造を定義し、r1に従って大きいものから小さいものへと並べ替え、列挙すると、k+1からnになるようにkが存在します。は最初のシステムにあり、1からk-1は2番目のシステムの傍受範囲内にあります

#include<iostream>
#include<algorithm>
using namespace std;

const int M = 100006, inf = 10000000;

struct T{
	int x;
	int y;
	int a;
	int b;
}t[M];
int x_1, y_1, x_2, y_2;
int n;

int cmp(T a, T b){
	return a.a>b.a;
}

int main(){
	cin>>x_1>>y_1>>x_2>>y_2;
	cin>>n;
	for(int i = 1; i<=n; i++){
		cin>>t[i].x;
		cin>>t[i].y;
		t[i].a = (t[i].x - x_1)*(t[i].x-x_1) + (t[i].y-y_1)*(t[i].y-y_1);
		t[i].b = (t[i].x - x_2)*(t[i].x-x_2) + (t[i].y-y_2)*(t[i].y-y_2);
	}
	sort(t+1, t+n+1, cmp);
	int r2 = 0, ans = inf;
	for(int i = 1; i<=n; i++){
		r2 = max(t[i-1].b, r2);
		ans = min(ans,t[i].a+r2);
	}
	cout<<ans<<endl;
	
	return 0;
}
复制代码

\

おすすめ

転載: juejin.im/post/7087489707084349470