卧薪尝胆,厚积薄发。
Social Circles
Date: Wed Oct 10 15:29:12 CST 2018 In Category: NoCategory

Description:

给 $n$ 个人分配桌子,第 $i$ 个人要求左边空凳子不少于 $l_i$ 个,右边不少于 $r_i$ 个,桌子随意,问最少需要几个凳子。
$1\leqslant n \leqslant10^5$

Solution:

先把每个人拆点成 $u^+$ 和 $u^-$ ,然后 $i^+$ 和 $j^-$ 连 $\max(l_i,r_j)$ 的边,那最后这个二分图的最小权匹配就是答案,但是不能真求,考虑按 $l_i$ 排序,那么最大的 $l_i$ 肯定是尽可能带一个较大的 $r_j$ ,所以把 $l$ 和 $r$ 分别排序一次对着取就行了。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int n;
#define MAXN 100010
int a[MAXN],b[MAXN];
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;++i)
{
scanf("%d%d",&a[i],&b[i]);
}
sort(a + 1,a + 1 + n);
sort(b + 1,b + 1 + n);
long long ans = n;
for(int i = 1;i <= n;++i)
{
ans += max(a[i],b[i]);
}
cout << ans << endl;
return 0;
}
In tag: 算法-贪心
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡