这次的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; } //