CodeForces 1263A Sweet Problem(水题)

水题
题目意思:
有三个堆,每个堆都有若干相同颜色的笔,堆与堆之间颜色各不相同。现在要求每次从两个堆,各拿一支笔。
问,怎样操作,使得拿的笔最多? 输出操作次数(拿的笔的总数的一半)

本题要点:
1、 三堆, 从大到小排列, x >= y >= z. 如果 x >= y + z, 说明, 最多的一堆x 是拿不完的。
当 没有同时从 y 和 z 堆拿笔, 操作次数是最多的。最多 有 y + z 次。
2、当 x < y + z;
此时,做好分配策略。从 y 和 z 中,各自拿一些笔 和 x堆的笔一起拿掉。拿完 x 的笔后,使得
y 剩下的笔 y0 和 z 剩下的笔 z0, 相等或者差 1。 显然,x + y + z 是偶数时候, y0 和 z0 相等,
此时全部能拿掉。x + y + z 是偶数时候, y0 和 z0 差1, 最后还剩一个。
综上, x < y + z时, 操作次数 (x + y + z) / 2

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int T;
int a[3];

int main()
{
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d%d%d", &a[0], &a[1], &a[2]);
		sort(a, a + 3);
		if(a[2] >= a[0] + a[1])
		{
			printf("%d\n", a[0] + a[1]);
		}else{
			printf("%d\n", (a[0] + a[1] + a[2]) / 2);
		}
	}
	return 0;
}

/*
6
1 1 1
1 2 1
4 1 1
7 4 10
8 1 4
8 2 8
*/

/*
1
2
2
10
5
9
*/

猜你喜欢

转载自blog.csdn.net/qq_38232157/article/details/108445891