HDU 4811 Ball -2013 ICPC南京区域现场赛

题目链接

题意:三种颜色的球,现给定三种球的数目,每次取其中一个放到桌子上,排成一条线,每次放的位置任意,问得到的最大得分。

把一个球放在末尾得到的分数是它以前球的颜色种数

 

把一个球放在中间得到的分数是它前边球的颜色种数+后边的球颜色种数。

题解:由题意可知当三种颜色气球都大于等于2的时候是最好的情况,先一种颜色取两个得15分,然后把剩下的球全都放到中间即可,每次分数+6,题目中的样例就是这样的。当存在一种球的颜色小于2的时候我们分类讨论可以发现 0 1 1 和  0 0 2 的解是相同的,1 1 1 和 0 1 2 和 0 0 3 的解是相同的,后面都是 3*(3-1)/2 。我们把这个称之为底,每种颜色的球最多可以取两个加到底当中,再加上除去底之外的数*底即可。经过分析一个max一个min我们就可以得到结果了。

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll data[10];
    while(scanf("%lld%lld%lld",&data[0],&data[1],&data[2])!=EOF)
    {
        sort(data,data+3);
        ll sum1=min(data[0],2LL)+min(data[1],2LL)+min(data[2],2LL);
        ll sum2=data[0]+data[1]+data[2]-sum1;
        printf("%lld\n",sum1*(sum1-1)/2+sum1*sum2);
    }
    return 0;
}

 

posted @ 2016-09-22 21:38  Ritchie丶  阅读(246)  评论(0编辑  收藏  举报