题解 CF950A 【Left-handers, Right-handers and Ambidexters】

frankchenfu

2018-03-21 21:32:18

Solution

我们把这道题目分成两种情况讨论。 ## 情况一 如果左撇子和右撇子比例严重失调,也就是说即使所有可以左右手并用的都使用人数较少的那只手(不妨设为左手,也就是$l+a<r$),那么最终的答案一定就是$2(l+a)$,因为惯用右手的人会多出来,最优的方案就是让以左右手并用的都使用左手。 ## 情况二 我们假设人数少的还是惯用左手的人,如果不是情况一中提到的,那么就存在$l+a\ge r$。这时,我们先让一部分左右手并用的把人数补齐,使得$l'=r$,那么此时剩下的$a'=a-(r-l)$,这$a'$个人肯定时尽量平均分即可。最后答案就是$2(r+\lfloor\frac{m'}{2}\rfloor)$。由于涉及奇偶性,这里不再对上式化简(其实对于解题来讲已经足够了)。 ## 总结与代码 综上所述,当$l\le r$时有$$ans=\begin{cases}2(l+a) , for\ \ l+a<r.\\ 2(r+\lfloor\frac{r-l}{2}\rfloor) , for\ \ l+a\ge r\end{cases}$$ $r<l$时同理,在程序中只需要开始时判断并`swap`一下即可。 ```cpp #include<cstdio> #include<cstring> inline void swap(int &x,int &y){ int t=x;x=y;y=t; } int main(){ int l,r,m;scanf("%d%d%d",&l,&r,&m); if(l>r) swap(l,r); if(l+m<r){ printf("%d\n",(l+m)<<1); return 0; } m-=(r-l); l=r; printf("%d\n",(l+m/2)<<1); return 0; } ```