题意:三种颜色的球,现给定三种球的数目,每次取其中一个放到桌子上,排成一条线,每次放的位置任意,问得到的最大得分。
把一个球放在末尾得到的分数是它以前球的颜色种数
把一个球放在中间得到的分数是它前边球的颜色种数+后边的球颜色种数。
题解:由题意可知当三种颜色气球都大于等于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 ",sum1*(sum1-1)/2+sum1*sum2); } return 0; }