该问题的链接如下:http://codeforces.com/problemset/problem/478/C

您有r红色,g绿色和b蓝色气球。要为宴会装饰一张桌子,您需要三个气球。附在一张桌子上的三个气球不应具有相同的颜色。如果我们知道每种颜色的气球数量,最多可以装饰多少张桌子?

您的任务是编写一个程序,对于给定的值r,g和b,它将找到表t的最大数量,可以按要求的方式进行修饰。

输入:
单行包含三个整数r,g和b(0≤r,g,b≤2·10 ^ 9)—分别是红色,绿色和蓝色气球的数量。这些数字正好用一个空格分隔。

输出:
打印单个整数t-可以按所需方式修饰的最大表数。

因此,我以贪婪的方式每次都搜索最大值和最小值,并在可能的情况下分别减去2和1。这是我的代码:

int main (void)
{
    int ans=0,r,g,b;
    cin>>r>>g>>b;
    while (1)
    {
        int a1 = maxfind(r,g,b);
        int a2 = minfind(r,g,b);
        //ans++;
        if (a1 >= 2 && a2 >= 1)
        {
            ans++;
            if (indma == 1)
                r = r-2;
            else if (indma == 2)
                g = g-2;
            else
                b = b-2;
            if (indmi == 1)
                r = r-1;
            else if (indmi == 2)
                g = g-1;
            else
                b = b-1;
        }
        else if (r == 1 && g == 1 && b == 1)
        {
            ans++;
            break;
        }
        else
            break;

    }
    cout<<ans<<"\n";

int maxfind(int r, int g, int b)
{
    indma = 0;
    int temp = INT_MIN;
    if (r >= temp)
    {
        temp = r;
        indma = 1;
    }
    if (g >= temp)
    {
        temp = g;
        indma = 2;
    }
    if (b >= temp)
    {
        temp = b;
        indma = 3;
    }
    return temp;
}
findmin的功能与此类似,并且在最大值和最小值相同的情况下,请确保选择的编号不同。但是,由于限制为2 * 10 ^ 9,因此显然超过了时间限制。我该如何优化呢?谢谢!

编辑:您可以在问题的链接中轻松找到示例测试用例。但是,我仍然要添加其中之一。
Input
5 4 3
output
4

说明:在第一个示例中,您可以使用以下气球组装饰表格:“rgg”,“gbb”,“brr”,“rrg”,其中“r”,“g”和“b”分别代表红色,绿色和蓝色球。

最佳答案

您可以将此问题分为两种情况,要么使用所有气球(剩余0、1或2个气球),要么不使用,因为一种颜色太多而另外两种颜色不足。

如果您使用所有气球,答案就是(r + g + b)/ 3

如果您不使用所有气球,则答案等于三个数字中较低的2个数字之和。

t = min((r+g+b)/3,r+g+b-max(r,g,b))

关于c++ - 我该如何优化使其高效运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32915094/

10-11 17:28