[USACO23DEC] Bovine Acrobatics S
这题看起来无从下手,我们没法立即就找到多项式复杂度内的做法。故而考虑贪心。
容易想到排序后处理。考虑两种排序方式:
- 按体重排序
- 按牛的数量排序
显然第一种相比于第二种更可能是这道题的解法。
尝试按体重从小到大处理,每次把新的一种体重的牛加进去。加到怎样的序列合适呢?我们发现只要是当前能加的都行。因为当前能加进去的,后面也能加进去(体重现在有单调性)。
点击查看代码
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现