原题链接:
题解:
贪心:
维护一个数组用于存储"第i块区域开垦耗时-缩短 1 天所需资源数量",然后逆序遍历,如果当前资源可以维持当前最大开垦耗时区域的优化资源(缩短该区域开垦时间 1 天所需资源数量),那么就消耗,然后当前的缩短 1 天所需资源数量加到下一个最大开垦耗时区域的优化资源中即可,直到m耗尽或者减到k(最小开垦耗时)即可。
例子:
样例一:
4 9 2
6 1
5 1
6 2
7 1流程:
初始:5-1, 6-(2+1), 7-1 m:9
①:5-1, 6-(3+1) m:8
②:5-(1+4) m:4
③:end
二分:
参考Pujx(orz):
CCF-CSP认证考试 202303-2 垦田计划 100分题解-CSDN博客
代码:
#include<bits/stdc++.h>
using namespace std;
using PII = pair<int, int>;
int n, m, k;
int min_d = 0;
const int N = 1e5 + 10;
int T[N];
int main() {
cin >> n >> m >> k;
for (int i = 0;i < n;i++) {
int t, c;cin >> t >> c;
min_d = max(min_d, t);
T[t] += c;
}
for (int i = min_d;i >= k + 1;i--) {
if (m > T[i]) {
m -= T[i];
T[i - 1] += T[i];
min_d = i - 1;
}
else break;
}
cout << min_d;
}
坑点:
无