HDU 4811 Ball 公式

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

题意:给你三种颜色的球及其个数。你通过以下操作把球放成一行来得分:

          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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值