首页 > 其他分享 >[USACO23DEC] Bovine Acrobatics S

[USACO23DEC] Bovine Acrobatics S

时间:2024-02-04 09:04:19浏览次数:30  
标签:tmp 排序 cow USACO23DEC Bovine int ans Acrobatics hd

这题看起来无从下手,我们没法立即就找到多项式复杂度内的做法。故而考虑贪心。

容易想到排序后处理。考虑两种排序方式:

  1. 按体重排序
  2. 按牛的数量排序

显然第一种相比于第二种更可能是这道题的解法。

尝试按体重从小到大处理,每次把新的一种体重的牛加进去。加到怎样的序列合适呢?我们发现只要是当前能加的都行。因为当前能加进去的,后面也能加进去(体重现在有单调性)。

点击查看代码
#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;
}

标签:tmp,排序,cow,USACO23DEC,Bovine,int,ans,Acrobatics,hd
From: https://www.cnblogs.com/zac2010/p/18005539

相关文章