frankchenfu 的博客

frankchenfu 的博客

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

posted on 2018-03-21 21:32:18 | under 题解 |

我们把这道题目分成两种情况讨论。

情况一

如果左撇子和右撇子比例严重失调,也就是说即使所有可以左右手并用的都使用人数较少的那只手(不妨设为左手,也就是$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一下即可。

#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;
}