HDU4811_Ball

又是数学题。

每次放入一个球所得到的的分数为x1+x2(x1表示左边的球中颜色的种数,x2表示右边)

其实如果一个球的数量超过了2,那么剩下的就是一个乘法了。 这个理解很简单,因为超过了2的话,说明最优的方案一定是左右各一个,不然如果都在一边的话就只得1分了。

所以我们预处理出所有不超过2的情况的得分(手算吧),然后剩余的就做一个乘法就可以了。

略水,开始没有保证三个数的顺序,手滑。。。。。T_T

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long ll;
using namespace std;

ll a[3][3][3];
ll f[4],n,k,tep;

int main()
{
    a[0][0][0]=0,a[0][0][1]=0,a[0][0][2]=1,a[0][1][1]=1,a[0][1][2]=3,a[0][2][2]=6;
    a[1][1][1]=3,a[1][1][2]=6,a[1][2][2]=10,a[2][2][2]=15;
    while (cin>>f[1]>>f[2]>>f[3])
    {
        n=k=0;
        for (int i=1; i<4; i++)
        {
            if (f[i]>2) k=2;
                else k=f[i];
            n+=f[i]-k,f[i]=k;
        }
        sort(f+1,f+4);
        tep=f[1]+f[2]+f[3];
        cout<<a[f[1]][f[2]][f[3]]+n*tep<<endl;
    }

    return 0;
}
如有转载,请注明出处(http://www.cnblogs.com/lochan)
原文地址:https://www.cnblogs.com/lochan/p/3451794.html