思路:每个桌子的三个气球只有两种情况:1 + 1 + 1或者 2 + 1
使用贪心的策略,每次使用2 + 1的放法。
先将三种气球按数量排序,不失一般性,令r, g, b的数目有
所以基本放法是:bb + (r / g)。所以按照2 +1的策略放,到最后有两种情况:①r和g无剩余;②r,g有剩余;
① r和g无剩余 ,此时只有b剩余,不能装饰新的桌子,故解为
② r,g有剩余 ,此时r和g有剩余(b也可能有剩余,需要考虑)
则首先根据2 + 1的原则,用bb + (r/g)来放置,直到b小于2,剩余的r和g也按照2 + 1放置。
下面证明两种颜色的球至多可以装饰张桌子。
令r球有a个,g球有b个,有x张桌子为rrb,y张桌子为bbr,则:
得
1)b球无剩余,则令,解为
2)b球剩余1个
i. 若。则最后还剩余两个r/g,可以与b再装饰一个桌子,解为:
ii. 若,则r、g球刚好装饰整数张桌子,没有多余,解为:
iii. 若,则最后余下1个r或g,解为:
综上:时,最优解为
AC代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
long long a[3];
int main(){
long long sum = 0;
for(int i = 0; i < 3; i ++)
scanf("%I64d", &a[i]), sum += a[i];
sort(a, a + 3);
if(a[0] + a[1] <= a[2] / 2)
printf("%I64d\n", sum - a[2]);
else
printf("%I64d\n", sum / 3);
return 0;
}