沫璃邀请她的朋友参加周末的派对。沫璃买了3种颜色的气球,现在她要有这些气球来装饰餐桌,每个餐桌只用恰好3个气球装饰,要求3个气球的颜色不能完全一样,可以是2种或者3种颜色。沫璃想知道这些气球最多能装饰多少张餐桌。
沫璃邀请她的朋友参加周末的派对。沫璃买了3种颜色的气球,现在她要有这些气球来装饰餐桌,每个餐桌只用恰好3个气球装饰,要求3个气球的颜色不能完全一样,可以是2种或者3种颜色。沫璃想知道这些气球最多能装饰多少张餐桌。
第一行一个数T(T<=100),表示数据组数。
对于每组数据,第一行3个整数r,g,b,分别表示三种颜色的气球个数(0<=r, g, b<=2*10^9)
对于每组数据,输出一行,一个整数表示最多能装饰的餐桌数量。
2 5 4 3 2 3 3
4 2
''' qq表示各色气球的数量的列表,对qq进行排序, 因为要最大化搭配数,所以先从数量最多的气球qq[2]入手, 第一次搭配:最多颜色的气球2个搭配次多颜色的气球1个,总个数减去3个; ... 第i次搭配:最多颜色的气球2个搭配次多颜色的气球1个,总个数减去3*i个; ... 第n次:次多颜色的气球数量变成0后,搭配结束,此时总个数减去3*n个,一共有n种搭配。 但是结束的时候颜色最多的气球数量可能还有很多,所以此时考虑两种情况: 1)颜色最多的气球数量s == 0,1,2时,s//3==0,所以n=sum(qq)//3; 1)颜色最多的气球数量s > 3时,n=颜色最少的气球数量+颜色次少的气球数量; ''' N = int(input()) while N > 0: qq = list(map(int, input().split())) qq.sort() if (qq[0]+qq[1])*2 < qq[2]: res = qq[0]+qq[1] else: res = sum(qq)//3 print(res) N -= 1
import java.util.Arrays; import java.util.Scanner; //两种情况: // 1)最大的那个数是其他两个数之和的两倍,输出最小的和次小的数之和 // 2)直接三个数除以3 /** * 沫璃邀请她的朋友参加周末的派对。沫璃买了3种颜色的气球,现在她要有这些气球来装饰餐桌, * 每个餐桌只用恰好3个气球装饰,要求3个气球的颜色不能完全一样,可以是2种或者3种颜色。 * 沫璃想知道这些气球最多能装饰多少张餐桌。 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for (int i = 0; i < n; i++) { long[] num = new long[3]; for (int j = 0; j < 3; j++) { num[j] = sc.nextLong(); } Arrays.sort(num); if(num[2]/2>=num[0]+num[1]){ System.out.println(num[0]+num[1]); }else System.out.println((num[0]+num[1]+num[2])/3); } } }
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { vector<long long>res(3); long long num; for (int i = 0; i < 3; i++)cin >> res[i]; sort(res.begin(), res.end()); if (2*(res[0] + res[1]) <= res[2])num = res[0] + res[1]; else num = (res[0] + res[1] + res[2]) / 3; cout << num << endl; } return 0; }