P9977 [USACO23DEC] Bovine Acrobatics S
题目描述
Farmer John 决定让他的奶牛表演杂技!首先,FJ 为他的奶牛称重,发现她们有 N N N( 1 ≤ N ≤ 2 × 10 5 1\le N\le 2\times 10^5 1≤N≤2×105)个不同的体重。具体来说,对于全部的 i ∈ [ 1 , N ] i\in [1,N] i∈[1,N],有 a i a_i ai 只奶牛的体重为 w i w_i wi 单位( 1 ≤ a i ≤ 10 9 , 1 ≤ w i ≤ 10 9 1\le a_i\le 10^9, 1\le w_i\le 10^9 1≤ai≤109,1≤wi≤109)。
他最出名的节目需要奶牛叠成平衡的奶牛塔。一座奶牛塔是一些奶牛,每只奶牛站在下一只奶牛身上。一座奶牛塔是平衡的,当且仅当每一只被踩着的奶牛,都比直接踩在它身上的那只奶牛重至少 K K K( 1 ≤ K ≤ 10 9 1\le K\le 10^9 1≤K≤109)单位。每只奶牛都可以成为奶牛塔的一部分。
如果 FJ 想要创造最多 M M M( 1 ≤ M ≤ 10 9 1 \le M \le 10^9 1≤M≤109)座奶牛塔,最多有多少只奶牛可以成为奶牛塔的一部分?
输入格式
第一行包含三个空格分隔的整数 N N N, M M M 和 K K K。
接下来 N N N 行,每行包含两个空格分隔的整数 w i w_i wi 和 a i a_i ai。保证所有的 w i w_i wi 是不同的。
输出格式
输出当 FJ 采用最佳方案时,奶牛塔中奶牛的最大数目。
输入输出样例 #1
输入 #1
3 5 2
9 4
7 6
5 5
输出 #1
14
输入输出样例 #2
输入 #2
3 5 3
5 5
7 6
9 4
输出 #2
9
说明/提示
样例解释 1
FJ 可以用体重为 5 , 7 , 9 5,7,9 5,7,9 的奶牛创造四座平衡的奶牛塔,再用体重为 5 , 7 5,7 5,7 的奶牛创造另一座。
样例解释 2
FJ 可以用体重为 5 , 9 5,9 5,9 的奶牛创造四座平衡的奶牛塔,再用体重为 7 7 7 的一只奶牛创造另一座。或者,他可以用体重为 5 , 9 5,9 5,9 的奶牛创造四座平衡的奶牛塔,再用体重为 5 5 5 的一只奶牛创造另一座。
测试点性质
- 测试点 3 − 5 3-5 3−5 满足 M ≤ 5000 M \le 5000 M≤5000 且奶牛的总数不超过 5000 5000 5000。
- 测试点 6 − 11 6-11 6−11 满足奶牛的总数不超过 2 ⋅ 10 5 2\cdot 10^5 2⋅105。
- 测试点 12 − 17 12-17 12−17 没有额外限制。
C++实现
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define PII pair<int, int>
const int N = 2e5 + 10;
int n, m, k;
PII x[N];
LL ans;
LL q1[N], q2[N], hh = 1, tt;
int main()
{
cin >> n >> m >> k;
for(int i = 1; i <= n; i++)
scanf("%d%d", &x[i].first, &x[i].second);
sort(x + 1, x + n + 1);
for(int i = 1; i <= n; i++)
{
while(hh <= tt && x[i].first - q1[hh] >= k)
m += q2[hh++];
q1[++tt] = x[i].first;
q2[tt] = min(x[i].second, m);
m -= q2[tt], ans += q2[tt];
}
cout << ans << endl;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥题 P9977 USACO23DEC Bovine Acrobatics S&spm=1001.2101.3001.5002&articleId=162115041&d=1&t=3&u=f38edeabbf0145d6acd10403a9dba303)
1181

被折叠的 条评论
为什么被折叠?



