题目
这道题我们可以每个班的人和茶都拆分成一个个人和一杯杯茶,然后每个人和其他班的茶连边,求最大匹配,求二分图最大匹配我们想到匈牙利,但在这里数据太大跑不了。然后就可以上这个公式了。
虽然看起来是直接套公式就可以了,但毕竟
是子集,还是不容易的,那怎么做呢?
那就分类讨论吧。
- 翻译第一句,当 为空集,答案就为 ,这个怎么理解呢?我们所有学生都能分配到一杯茶,这个情况就成立了。
- 翻译第二句,当所有学生都来自同一个班级,那么 就是全体学生,后面那个就是除了自己班的茶,减一下就行,不懂看代码。
- 当学生都来自不同的班级,那么
就是全体学生,后面那个是所有茶,因为不同班学生了,已经有所有茶的边了。
那答案就是对这三种情况取最小,毕竟可能存在不存在某一种情况。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define int long long
using namespace std;
int t,n,a[1000005],b[1000005],ans,sum1,sum2;
signed main()
{cin>>t;while(t--){sum1=0,sum2=0;scanf("%lld",&n);for(int i=1;i<=n;i++){scanf("%lld %lld",&a[i],&b[i]);sum1+=a[i];sum2+=b[i];}ans=min(sum1,sum2);int cnt=0;for(int i=1;i<=n;i++){cnt=max(cnt,(a[i]-(sum2-b[i])));}ans=min(ans,sum1-cnt);printf("%lld\n",ans);}
}