题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4811php
题目描述:ios
题意:spa
有三种颜色,给你每种颜色的球的数量,有如下两种得分方式,问你如何放置这些球,让总得分最大。code
方式一:放第一个球的得分为0blog
方式二:放在最后面的得分为以前的全部球的颜色种数three
方式三:放在中间的得分为左边球的颜色种数+右边球的颜色种数ip
思路:ci
找规律,推导出公式,由于只有三种颜色,若是每种颜色都有2的及以上,那么能够先在两边各摆三种颜色的球,这样每次把其余球放入中间时都能获得6分,即ans=(R-2+Y-2+B-2)*6+15(15为在两边各摆三种颜色的球的过程所得到的总得分)。get
其实若是一个球的数量超过了2,那么剩下的就是一个乘法了。 这个理解很简单,由于超过了2的话,说明最优的方案必定是左右各一个,否则若是都在一边的话就只得1分了。input
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> typedef long long ll; using namespace std; ll a[3][3][3];//a[i][j][k]表示红色球为i个,黄色球为j个,蓝色球为k个的排列总数 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; }