首页 > 试题广场 >

派对

[编程题]派对
  • 热度指数:1877 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解

沫璃邀请她的朋友参加周末的派对。沫璃买了3种颜色的气球,现在她要有这些气球来装饰餐桌,每个餐桌只用恰好3个气球装饰,要求3个气球的颜色不能完全一样,可以是2种或者3种颜色。沫璃想知道这些气球最多能装饰多少张餐桌。


输入描述:
第一行一个数T(T<=100),表示数据组数。

对于每组数据,第一行3个整数r,g,b,分别表示三种颜色的气球个数(0<=r, g, b<=2*10^9)


输出描述:
对于每组数据,输出一行,一个整数表示最多能装饰的餐桌数量。
示例1

输入

2
5 4 3
2 3 3

输出

4
2

注意分类讨论的条件,如果最大的比两个小的加起来的两倍还大,那最大的一些气球就用不到,要是没有小的加起来两倍那么大,就都可以取到,直接除以3即可。
#include <iostream>
using namespace std;
 
void sort(long *arr){
    for(long t=1;t<3;t++){
        for(long i=0;i<3-t;i++){
            if(arr[i] > arr[i+1]) swap(arr[i], arr[i+1]);
        }
    }
}
int main(){
    intT;
    cin>>T;
    long result;
    long arr[3];
    for(inti=0;i<T;i++){
        cin>>arr[0]>>arr[1]>>arr[2];
        sort(arr);
        if(arr[2] >= 2*(arr[1]+arr[0])) {
            result = arr[1] + arr[0];
        } else{
            result = (arr[0] + arr[1] + arr[2])/3;
        }
        cout<<result<<endl;
    }
    return0;
}
发表于 2019-08-02 16:39:18 回复(4)
'''
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

发表于 2019-08-15 09:57:39 回复(2)
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);
        }
    }
}

发表于 2019-08-15 16:13:29 回复(8)
T =int(input())  #数据数组
for i in range(T):
    r, g, b =map(int, input().split()) #三种颜色气球数量
    max_num =int((r +g +b) /3)  #最大
    max_color =max([r, g ,b])
    flag =max_color -(sum([r, g, b]) - max_color) *2 #查看同类颜色多余数量
    ifflag > 0:
        max_num =max_num - int(flag /3)
    print(max_num)
编辑于 2019-08-06 23:18:36 回复(0)
#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;
}

发表于 2020-07-02 15:55:53 回复(0)
#include<bits/stdc++.h>

using namespace std;

int main() {
 int t;
 cin >> t;
 typedef long long LL;
 for(LL r,g,b;t--;) {
  cin>>r>>g>>b;
  LL R = min(min(r,g),b), G = max(max(r,g),b), B = r+g+b-R-G;
  LL ans = (R+B)*2<=G?R+B:(R+G+B)/3;
  cout<<ans<<endl;
 }
 return 0;
}
发表于 2020-03-23 18:57:04 回复(0)
通过率:0%
importjava.util.*;
publicclassMain{
    publicstaticvoidmain(String[] args){
        Scanner sc = newScanner(System.in);
        intT = sc.nextInt();
        int[] geshu = newint[3];
        for(inti = 0; i < T; i++){
             
            intnum = 0;
            intzongshu = 0;
            for(intj = 0; j < 3; j++){
                geshu[j] = sc.nextInt();
                zongshu = zongshu + geshu[j];
            }
            num = zongshu/3;
            Arrays.sort(geshu);
            if(geshu[2] - geshu[0] >= 3){
                num = num - (geshu[2] - geshu[0])/3;
            }
            System.out.println(num);
        }
    }
}
发表于 2019-08-08 21:43:47 回复(0)
/**通过了所有的例子验证,但是编译显示通过率为50%,想不明白哪里错了,望大神指正****/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
  int T;
  //long r,g,b;
  vector<long> ai(3);
  cin>>T;
  if(T>100 || T<=0){
    cout<<"put error"<<endl;
  }
  else{
    for(int i=0;i<T;++i)
     {cin>>ai.at(0)>>ai.at(1)>>ai.at(2);
      vector<long>::iterator it=ai.begin();
      sort(it,it+2);
      if(*it>=0 && *(it+2)<=2*10^9)
       {
        if(*(it+2)>=2*(*(it+1)+*it))
          cout<<*(it+1)+*it<<endl;
         else
           cout<<(*(it+2)+*(it+1)+*it)/3<<endl;
       }
      }
  }
 
  return 0;
}
发表于 2019-08-06 15:31:30 回复(1)