题意:给你三种颜色的球及其个数。你通过以下操作把球放成一行来得分:
1.放下第一个球不得分。
2.其他的球,可以选择放在中间或着两边。放在中间,得到的分数是以放入的位置为分界线,两边每边不同颜色的数目之和。如果放在两边,就是不同颜色的数目。
求最多的得分。
思路:因为只有三种颜色,增加到一定的数目后,再放入球,得到的分数是不变的。这样,我们只需处理小范围的数据,之后直接公式计算就可以了。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long c[5];
int n;
void one(long long a)
{
if(a==1)
printf("0\n");
else
printf("%I64d\n",1LL+2LL*(a-2LL));
}
void two(long long a,long long b)
{
if(a==1 && b==1)
printf("1\n");
else if(a==1 && b>=2)
printf("%I64d\n",3LL+(a+b-3LL)*3LL);
else
printf("%I64d\n",6LL+(a+b-4LL)*4LL);
}
void three(long long a, long long b ,long long c)
{
if(a==1&&b==1&&c==1)
printf("3\n");
else if(a==1&&b==1&&c>=2)
printf("%I64d\n",6LL+(a+b+c-4LL)*4LL);
else if(a==1&&b>=2&&c>=2)
printf("%I64d\n",10LL+(a+b+c-5LL)*5LL);
else
printf("%I64d\n",15LL+(a+b+c-6LL)*6LL);
}
int main()
{
//freopen("in","r",stdin);
while(scanf("%I64d %I64d %I64d",&c[0],&c[1],&c[2])!=EOF)
{
sort(c,c+3);
//printf("%I64d %I64d %I64d\n",c[0],c[1],c[2]);
if(c[2]==0) printf("0\n");
else if(c[1] == 0) one(c[2]);
else if(c[0] == 0) two(c[1],c[2]);
else three(c[0],c[1],c[2]);
}
return 0;
}

本文介绍了一种针对三色球排列的得分算法,通过特定的操作规则放置球以获得最大分数,采用数学方法简化计算过程。

1181

被折叠的 条评论
为什么被折叠?



