試題請參見: https://vijos.org/p/1066
題目概述
mx在他的基地附近建立了n個戰壕, 每個戰壕都是一個獨立的作戰單位, 射程可以達到無限(“mx不贏定了?!?”永恆ftING...@_@).
但是, 戰壕有一個弱點, 就是隻能攻擊它的左下方, 說白了就是橫縱座標都不大於它的點(mx:“我的戰壕爲什麼這麼菜”ToT). 這樣, 永恆就可以從別的地方進攻摧毀戰壕, 從而消滅mx的部隊.
戰壕都有一個保護範圍, 同它的攻擊範圍一樣, 它可以保護處在它左下方的戰壕. 所有處於它保護範圍的戰壕都叫做它的保護對象. 這樣, 永恆就必須找到mx的戰壕中保護對象最多的點, 從而優先消滅它.
現在, 由於永恆沒有時間來計算, 所以拜託你來完成這個任務:
給出這n個戰壕的座標xi、yi, 要你求出保護對象個數爲0, 1, 2……n-1的戰壕的個數.
輸入
接下來n行,每行兩個數xi,yi,代表第i個點的座標
(1<=xi,yi<=32000)
注意:可能包含多重戰壕的情況(即有數個點在同一座標)
輸出
解題思路
乍看一眼覺得很複雜, 真的理解題意之後發現弱爆了.
對於每一個戰壕, 查找座標不超過自身的點, 並存儲結果.
查找時, 會將戰壕本身也計算在內, 因此我們計算完成後, 需要減去1(當前戰壕本身).
遇到的問題
完全木有算法可言的題目, 連樸素O(n^2)算法都AC了.
源代碼
#include <iostream>
#include <fstream>
struct Point {
int x;
int y;
};
int main() {
using std::cin;
// std::ifstream cin;
// cin.open("input.txt");
const int MAX_TRENCHES = 15000;
int n = 0;
Point trenches[MAX_TRENCHES];
int counter[MAX_TRENCHES] = {0};
// Input
cin >> n;
for ( int i = 0; i < n; ++ i ) {
cin >> trenches[i].x >> trenches[i].y;
}
// Processing
for ( int i = 0; i < n; ++ i ) {
int totalProtected = 0;
for ( int j = 0; j < n; ++ j ) {
if ( trenches[j].x <= trenches[i].x && trenches[j].y <= trenches[i].y ) {
++ totalProtected;
}
}
++ counter[totalProtected - 1];
}
// Output
for ( int i = 0; i < n; ++ i ) {
std::cout << counter[i] << std::endl;
}
return 0;
}