hdu4811 2013ACM/ICPC亚洲区南京站 Ball

题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=4811

思路一:

对于球数量 < 3 的情况,特判就好了

然后分四种情况讨论:

1.数量为0的球只有一个 

两种情况

  1.a = 0, b = 1, c >= 2 (当然对于a 可以是三种任意颜色,结果都一样)

  找规律发现

  ans = 3 * sum - 6

 
 2.a = 0, b >= 2, c >= 2 (同样对于a 可以是三种任意颜色,结果都一样)
找规律发现
 ans = 4 * sum - 10;

2.数量为0的球只有两个

  找规律发现

  ans = 2 * sum - 3;

3.数量为0的球有三个

  这种很简单 ans = 0

4.数量为0的球有0个

  3种情况

  1. 球的数量为 a = 1,  b = 1, c >= 2

    ans = 4 * sum - 10;

  2.球的数量为 a = 1,  b >= 2, c >= 2

    ans = 5*sum - 15;

  3.球的数量为 a = 1,  b = 1, c = 1;

    ans = 3;

#include <iostream>
using namespace std;

typedef long long ll;
int main()
{
    ll a, b, c;
    while (~scanf("%lld %lld %lld", &a, &b, &c))
    {
        ll ans = 0;
        ll sum = a + b + c; // 球的总数
        if (sum == 0) ans = 0;
        else if (a == sum || b == sum || c == sum) // .数量为0的球只有两个
        {
            if (sum == 1) ans = 0;
            else
                ans = 2*sum - 3;
        }
        else if (a == 0|| b == 0 || c == 0) // .数量为0的球只有一个 
        {
            if (a != 1 && b!=1 && c!= 1){
            if (sum == 2)
            {
                ans = 1;
            }
            else if (sum == 3)
                ans = 3;

            else ans = 4 * sum - 10; // ans = 4 * sum - 10;
            }
            else{
                if (sum == 2)
                {
                    ans = 1;
                }
                else if (sum == 3)
                    ans = 3;
                else ans = 3 * sum - 6; //1.a = 0, b = 1, c >= 2 
            }
        }
        else if (a && b && c)
        {
            if (a >= 2 && b >= 2 && c >= 2)
            {
                ans = 15 + (sum - 6) * 6;
            }
            else if ((a <2 && b <2 && c >= 2)||(b <2 && a >=2 && c <2)||(b >=2 && c <2 && a < 2))
            {
                ans = 4 * sum - 10;
            }
            else if ((a <2 && b >=2 && c >= 2)||(b <2 && a >=2 && c >=2)||(b >=2 && c <2 && a >= 2))
            {
                ans = 5 * sum - 15;
            }
            else if (a < 2 && b < 2 && c < 2)
            {
                ans = 3;
            }
        }
        printf("%lld\n", ans);
    }
}

 

思路2 贪心

将个颜色的球,少于于两个的都取,多余两个的只取两个。可求出这些球的每次放球的最大加分s,则从最开始放球加0分,然后每次放球加的分比前一次多1,当放的球等于s-1时,其后便每次放球多加s分。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;

typedef long long ll;

int main()
{
    ll a[3];
    while (~scanf("%lld %lld %lld", &a[0], &a[1], &a[2]))
    {
        ll s = 0;
        for (ll i = 0; i < 3; i++)
        {
            if (a[i] < 2)
            {
                s += a[i];
            }
            else s += 2;
        }
        ll sum = a[0] + a[1] + a[2];
        ll ans = 0;
        for (ll i = 0; i < s; i++)
        {
            ans += i;
        }
        if (sum > s)
        {
            ans += (sum - s) * s;
        }
        printf("%lld\n", ans);
    }
}
posted @ 2020-01-12 13:07  hulian425  阅读(89)  评论(0编辑  收藏  举报