hdu 6667

题目

在这里插入图片描述
这道题我们可以每个班的人和茶都拆分成一个个人和一杯杯茶,然后每个人和其他班的茶连边,求最大匹配,求二分图最大匹配我们想到匈牙利,但在这里数据太大跑不了。然后就可以上这个公式了。
虽然看起来是直接套公式就可以了,但毕竟 S |S| 是子集,还是不容易的,那怎么做呢?
那就分类讨论吧。

  1. 翻译第一句,当 S S' 为空集,答案就为 U |U| ,这个怎么理解呢?我们所有学生都能分配到一杯茶,这个情况就成立了。
  2. 翻译第二句,当所有学生都来自同一个班级,那么 S |S| 就是全体学生,后面那个就是除了自己班的茶,减一下就行,不懂看代码。
  3. 当学生都来自不同的班级,那么 S |S| 就是全体学生,后面那个是所有茶,因为不同班学生了,已经有所有茶的边了。
    那答案就是对这三种情况取最小,毕竟可能存在不存在某一种情况。
#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);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_37073764/article/details/107528795