题意:

有若干个班,每个班有些人要喝奶茶,也提供一些奶茶,一人喝一杯,但是自己班的人不能喝自己班的奶茶,求最多能有多少人喝上奶茶。

题解:

典型的二分图匹配问题,学生在左,奶茶在右,学生和非自己班的奶茶连边。

因为班级数1e6,每个班级有1e9个奶茶或学生,直接按照上述建边跑匈牙利算法会T

考虑霍尔结婚定理:点集S,点集T,边集E,其中E中的边所连两点一点在S中,一点在T中,如果S中的k个点各自经过E与T中k个不同的点相连,则称形成了一个大小为k的匹配。

k=|S|则称为完美匹配

对于S的任意子集W,如果|W|<=|Ng(W)|  <==> S有完美匹配。

其中Ng(W)为点集T中所有与W相邻(neighbor)的结点的集合。

必要性(<=)显然。

充分性(=>)...还不会,要用数学归纳法,先挖个坑。

推论:

最大匹配为对于任意S的子集W

|S|-max(|W|-|Ng(W)|)

证明不难,找一个满足霍尔定理完美匹配要求的S的子集,踢开剩下的点,就是一个完美匹配。

我们去找那个让 (|W|-|Ng(W)|)最大化的W'

对于此题,只有如下三种情况:

1,W'为空,此时所有学生都能喝到奶茶。

2,W'只包含一个班的学生,那么Ng(w)就一定是其他班的奶茶,W'想最大化必然包括这个班所有学生

3,W'包含了多个班的学生,那么Ng(w)就一定是所有的奶茶,同理,W'想最大化,必须包括所有学生,此时有多少奶茶就有多少人喝。

具体执行步骤如下:

逐个遍历班级,维护非此班级的奶茶数,检查此班同学人数是否大于非此班奶茶数。

出现0次这种情况,答案为总人数

每出现一次这种情况,答案记为原答案 和 总人数-此班人数+非此班奶茶数 的较小值

最后检查总奶茶数是否更小。

#include <bits/stdc++.h>
#define LL long long
using namespace std;
int n;
LL a[], b[]; int main() {
int T; scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (int i = ; i < n; i++) scanf("%lld%lld", a + i, b + i);
LL totu = accumulate(a, a + n, 0ll);
LL totv = accumulate(b, b + n, 0ll);
LL ans;
int flag=;
for (int i = ; i < n; i++) {
if(a[i]>totv-b[i]){
ans=totu-a[i]+totv-b[i];
flag++;
}
}
if(flag==){
ans=totu;
}
ans=min(ans,totv);
printf("%lld\n", ans);
}
return ;
}

最新文章

  1. 你从未知道如此强大的ASP.NET MVC DefaultModelBinder
  2. 浅谈display:flex
  3. Android Fragment
  4. 运行Python脚本的方法
  5. 跨代的对决 英特尔i7-6700HQ对比i7-4720HQ性能测试
  6. UI学习笔记---第一天
  7. GridView九宫格菜单实现方式
  8. Python pycurl
  9. iOS9 UITableViewCell separatorInset设置为0分割线还是没有顶到头的问题
  10. Linux C++ 开发简介(包括Linux守护线程)
  11. Weka开发[3]-Evaluation类
  12. mysql 保存emoji时报,数据库报错:Caused by: java.sql.SQLException: Incorrect string value: &#39;\xF0\x9F\x98\x82\xF0\x9F...&#39; for column &#39;review&#39; at row 1
  13. Tomcat结构、启动过程、关键组件简单分析
  14. Formdata 图片上传 Ajax
  15. web.xml的&lt;url-parttern&gt;的匹配规则
  16. Visual Studio 2017
  17. hibernate一级缓存及对象的状态
  18. 常用的移动前端webapp交互细节
  19. lua tasklib 之lumen 分析
  20. 文本文件合并(C++实现)

热门文章

  1. webpack引入全局jQuery
  2. Debug - SpringBoot - Error starting ApplicationContext. To display the auto-configuration report re-runyour application
  3. 安卓Unity3d游戏的逆向破解
  4. Java/sql找出oracle数据库有空格的列
  5. The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.Builder i
  6. PHP面试 PHP基础知识 六(正则表达式)
  7. std::locale与boost::locale的学习
  8. PAT_A1041#Be Unique
  9. TortoiseGit密钥设置
  10. Flyway - Version control for your database