该问题的链接如下: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/