Vijos1066. 弱弱的戰壕

試題請參見: https://vijos.org/p/1066

題目概述

永恆和mx正在玩一個即時戰略遊戲, 名字嘛~~~~~~恕本人記性不好, 忘了-_-b. 
mx在他的基地附近建立了n個戰壕, 每個戰壕都是一個獨立的作戰單位, 射程可以達到無限(“mx不贏定了?!?”永恆ftING...@_@). 
但是, 戰壕有一個弱點, 就是隻能攻擊它的左下方, 說白了就是橫縱座標都不大於它的點(mx:“我的戰壕爲什麼這麼菜”ToT). 這樣, 永恆就可以從別的地方進攻摧毀戰壕, 從而消滅mx的部隊. 
戰壕都有一個保護範圍, 同它的攻擊範圍一樣, 它可以保護處在它左下方的戰壕. 所有處於它保護範圍的戰壕都叫做它的保護對象. 這樣, 永恆就必須找到mx的戰壕中保護對象最多的點, 從而優先消滅它. 
現在, 由於永恆沒有時間來計算, 所以拜託你來完成這個任務:
給出這n個戰壕的座標xi、yi, 要你求出保護對象個數爲0, 1, 2……n-1的戰壕的個數. 

輸入

第一行,一個正整數n(1<=n<=15000)
接下來n行,每行兩個數xi,yi,代表第i個點的座標
(1<=xi,yi<=32000)
注意:可能包含多重戰壕的情況(即有數個點在同一座標)

輸出

輸出n行, 分別代表保護對象爲0, 1, 2……n-1的戰壕的個數.

解題思路

乍看一眼覺得很複雜, 真的理解題意之後發現弱爆了.

對於每一個戰壕, 查找座標不超過自身的點, 並存儲結果.

查找時, 會將戰壕本身也計算在內, 因此我們計算完成後, 需要減去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;
}
發佈了50 篇原創文章 · 獲贊 1 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章