题意简述
道题,第 道有 支队伍通过; 种颜色的气球,第 种有 个。把颜色与题目一一对应,一道题能派发的气球数为「通过队伍数与该色气球数的较小值」。求最多能派发多少气球。
解题思路
一道题配上某色气球,能派发 个,于是问题就是把 与 一一配对,最大化 。
题目保证 与 都已单调不降。此时按下标顺次配对即最优,不必再排序。
用邻项交换证明。取任意 ,由单调性有 且 。比较交换 、 前后的贡献:
令 。因为 , 关于 单调不减,故 ,移项即得上式。任何交换都不增大总和,所以原序就是最优配对。
顺次累加 即可。和最大为 ,用 位整数累加。
时间复杂度为 。
参考代码
#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;
}