题目:https://cn.vjudge.net/contest/267843#problem/I
选座位
你邀请了n位客人到圆桌就餐,但是客人们很害羞,对于第i位客人,他要求左边至少要有li个空位,右边至少要有ri个空位,现在请你计算出至少要安排几张桌子。
输入格式
第一行一个数字n,表示客人的数量,
接下来n行,每一行有两个数字li和ri,表示客人的要求
100%的数据:1≤n≤10^5,0≤li,ri≤10^9。
输出格式
输出一行,表示答案。
输入样例
4
1 2
2 1
3 5
5 3
输出样例
15
看似很难,代码却贼短
???!!!
首先有个坑,就是这里不止一张桌子。。。
这里由xbc一手推出的方法:(xbc666)
1,对于所有人中,最大的 li 和最大的 ri 一定坐在一起,这样“无用”的空位会降到最少
2,把已经匹配了的人捆绑成一个“新人”,跟其他人继续第一步
3,第二步注意这里无需插入操作,因为对于lmax 的ri 和 rmax 的 li 都在队中而且排好序了。
so,重复第一步就相当于匹配第二大、第三大、第四大。。。
最终 ans+=max(l[i],r[i]) (l[] r[] 已排好序,ans指空位个数)
记得+n (你要坐人啊)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxS=100000;
int l[maxS+5],r[maxS+5];
int main()
{
int i,n;
long long ans;
// freopen("a.txt","r",stdin);
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d%d",&l[i],&r[i]);
sort(l+1,l+n+1);
sort(r+1,r+n+1);
ans=n;
for (i=n;i>=1;i--)
ans+=max(l[i],r[i]);
printf("%lld\n",ans);
return 0;
}