題目連接: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; }