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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章