水题,然而自己WA了orz,看到了一种很有意思的解法。
参考连接
链接
CodeForces-478C-Table Decorations
题目描述
给定红黄蓝三种气球的数量,要求每个桌子上放三个气球,且三个气球的颜色不能完全相同,求这些气球最多可以装饰几张桌子。
题解
假定三种气球的数量分别为a[0],a[1],a[2],且已按大小排好序,a[0] <= a[1] <= a[2]。
有两种情况:
2 * (a[0] + a[1]) <= a[2]。这种情况下可以每取一个a[0]取两个a[2]组成三气球或者每取一个a[1]取两个a[2]组成三气球,即取球集合为(1,0,2)和(0,1,2)。答案为a[0] + a[1]。2*(a[0] + a[1]) > a[2]。这种情况下我们从a[2]中取两个气球同时从max(a[0],a[1])中取一个气球,直到a[2] <= max(a[0],a[1])。这时满足max(a[0],a[1]) - a[2] <= 1和max(a[0],a[1]) - min(a[0],a[1]) <= 1。接下来的按集合(1,1,1)继续取球。可以发现这种取法最后剩余球的数量一定是(a[0]+a[1]+a[2]) mod 3,除去剩余的这些球(数量小于3),其它球每三个装饰一张桌子,所以针对这种情况我们直接可以用(a[0]+a[1]+a[2]) div 3来得到最终结果。
真是神解orz。
代码
1 | /* |