题意
有 n 个 人 , 坐 成 若 干 个 圈 . 每 个 人 要 求 左 边 有 l 张 空 椅 子 , 右 边 有 r 张 空 椅 子 . 求 至 少 要 多 少 张 椅 子 . ( 每 人 自 己 需 要 坐 一 个 椅 子 ) 有n个人,坐成若干个圈.\newline每个人要求左边有l张空椅子,右边有r张空椅子.\newline 求至少要多少张椅子.(每人自己需要坐一个椅子) 有n个人,坐成若干个圈.每个人要求左边有l张空椅子,右边有r张空椅子.求至少要多少张椅子.(每人自己需要坐一个椅子)
题解
非常好玩的一个题,当然是被大佬轻松秒掉了.
将
l
,
r
l,r
l,r两数组分别排序,输出
n
+
∑
i
=
1
n
max
(
l
[
i
]
,
r
[
i
]
)
n+\sum_{i=1}^{n}\max(l[i],r[i])
n+∑i=1nmax(l[i],r[i]).
然后思考为什么.
某一个
l
l
l可以和某一个
r
r
r匹配,匹配的结果是中间小的那个被约掉了,只剩下了大的那个.
那么显然最优的匹配就是最小的
l
l
l和最小的
r
r
r匹配,以此类推.
请注意是坐若干个圈,每个人当然有和自己匹配的可能.
在我所在的room有橙名大佬被神仙zhangzy hack了.
我一看他的代码.噗!没开long long
!
这种错误真是我都笑出来了,连橙名大佬都会犯的错误大家一定要注意了.
typedef long long ll;
const int yuzu=1e5;
typedef int fuko[yuzu|10];
fuko l,r;
int main(){
int i,n=read();
for (i=1;i<=n;++i) l[i]=read(),r[i]=read();
sort(l+1,l+n+1),sort(r+1,r+n+1);
ll llx=n;
for (i=1;i<=n;++i) llx+=max(l[i],r[i]);
cout<<llx<<endl;
}
谢谢大家.