CF513D Social Circles
阿新 • • 發佈:2018-12-13
文章目錄
題目
題目大意
你請了個客人吃飯,它們的椅子需要圍成一個或多個圈,但是客人們都有些害羞,第個客人希望他的左手邊至少有個空椅子,右手邊至少有個空椅子,問你最少需要多少個椅子。注意:客人會對自己感到害羞,也就是說,就算他所在的椅子圈只有他一個人,也要滿足上述條件。
思路
肯定要讓兩個客人的左右手匹配得越多越好,也就是說要最小化,如果你足夠貪心,直接可以想到:分別按左右手排序,最大的左手和最大的右手匹配,以此類推,然後你就AC
排完序後,假如不是和、和匹配,而是和、和匹配,我們可以比較和的大小。
不妨設(因為可以把所有人的左右手一起互換,但不能只換一部分),則,那麼: 分三類:
發現,即第二種方法不比第一種方法優。
(這個證明其實不嚴謹,但是比較好理解)
程式碼
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 100000
int N;
int Left[MAXN+5],Right[MAXN+5];
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d%d",Left+i,Right+i);
sort(Left+1,Left+N+1);
sort(Right+1,Right+N+1);
long long Ans=N;//每個人還要佔一個位置
for(int i=1;i<=N;i++)
Ans+=max(Left[i],Right[i]);
printf("%I64d",Ans);
}