296 words1 min
题解:P8109 [Cnoi2021] 幻想乡程序设计大赛
n 道题,第 i 道有 ai 支队伍通过;n 种颜色的气球,第 i 种有 bi 个。把颜色与题目一一对应,一道题能派发的气球数为「通过队伍数与该色气球数的较小值」。求最多能派发多少气球。
一道题配上某色气球,能派发 min(a,b) 个,于是问题就是把 {a} 与 {b} 一一配对,最大化 ∑min(ai,bi)。
题目保证 {a} 与 {b} 都已单调不降。此时按下标顺次配对即最优,不必再排序。
用邻项交换证明。取任意 x<y,由单调性有 ax≤ay 且 bx≤by。比较交换 bx、by 前后的贡献:
min(ax,bx)+min(ay,by)≥min(ax,by)+min(ay,bx).
令 g(t)=min(ay,t)−min(ax,t)。因为 ax≤ay,g 关于 t 单调不减,故 g(bx)≤g(by),移项即得上式。任何交换都不增大总和,所以原序就是最优配对。
顺次累加 min(ai,bi) 即可。和最大为 n×104=109,用 64 位整数累加。
时间复杂度为 O(n)。
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=100005;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
ll ans=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
ans+=min(a[i],x);
}
cout<<ans<<'\n';
return 0;
}