这题看起来无从下手,我们没法立即就找到多项式复杂度内的做法。故而考虑贪心。
容易想到排序后处理。考虑两种排序方式:
- 按体重排序
- 按牛的数量排序
显然第一种相比于第二种更可能是这道题的解法。
尝试按体重从小到大处理,每次把新的一种体重的牛加进去。加到怎样的序列合适呢?我们发现只要是当前能加的都行。因为当前能加进去的,后面也能加进去(体重现在有单调性)。
点击查看代码
#include <bits/stdc++.h>
#define FL(i, a, b) for(int i = (a); i <= (b); ++i)
#define FR(i, a, b) for(int i = (a); i >= (b); --i)
using namespace std;
typedef long long ll;
constexpr int N = 2e5 + 10;
struct Cow{
int w, a;
} cow[N];
int n, m, k;
int hd = 1, tl, q[N];
ll ans;
int main(){
scanf("%d%d%d", &n, &m, &k);
FL(i, 1, n){
scanf("%d%d", &cow[i].w, &cow[i].a);
}
sort(cow + 1, cow + n + 1, [&](Cow a, Cow b){
return a.w < b.w;
});
FL(i, 1, n){
int r = cow[i].a;
while(hd <= tl && r && cow[i].w >= cow[q[hd]].w + k){
int tmp = min(r, cow[q[hd]].a);
r -= tmp, cow[q[hd]].a -= tmp;
if(!cow[q[hd]].a) ++hd;
}
q[++tl] = i, cow[i].a -= r;
if(m){
int tmp = min(m, r);
m -= tmp, cow[i].a += tmp;
}
ans += cow[i].a;
}
printf("%lld\n", ans);
return 0;
}