Educational Codeforces Round 76 D

这次的ABC三道题非常水,但是我就卡在这个D题上了QAQ

当时大概猜到了贪心,但是没有思路,后来看了一些题解才明白到底是什么意思

首先,假设我们已经处理好了前面的monsters,对于第i个monster,肯定要选择一个能力大于它能力的勇者。那么该怎么选呢,显然(用贪心的思想分析,就是勇者如果能打到a而不是b (a > b),勇者的选择就更多了,这个选择包含达到b的选择,所以可以达到全局最优)我们希望这个勇者打败的怪物越多越好,所以我们需要找到一个勇者,他的power > max(monster_power[i] ~ monster_power[i + m]),寻找能使m最大的那个勇者。

附上代码(tips:这一题用memset会超时,必须手动清空

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 200010;
int pow[N], a[N];
int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int n, m;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%d", &a[i]);
        scanf("%d", &m);
        int maxn = 0;
        for (int i = 0; i < m; i++) {
            int p, s;
            scanf("%d %d", &p, &s);
            pow[s] = max(pow[s], p);
            maxn = max(maxn, s);
        }
        for (int i = maxn - 1; i >= 0; i--)
            pow[i] = max(pow[i + 1], pow[i]);
        int monster = 0, ans = 0, len = 1;
        int k = maxn;
        maxn = 0;
        while (monster < n) {
            maxn = max(a[monster], maxn);
            if (pow[len] >= maxn) {
                len++;
                monster++;
            }
            else if (len == 1) {
                ans = -2;
                break;
            }
            else {
                ans++;
                maxn = a[monster];
                len = 1;
            }
        }
        printf("%d
", ans + 1);
        for (int i = 0; i <= k; i++)
            pow[i] = 0;
    }
    return 0;
}
// 
原文地址:https://www.cnblogs.com/cminus/p/11877604.html