7-95 拔河比赛

【问题描述】 熊出没之探险日记,讲述了夏季休林季,光头强变身成为一名导游,并与熊大熊二一起, 帮助小女孩赵琳去往森林深处找寻儿时玩伴东北虎的故事。 某一天,他们准备进行拔河比赛,森林里很多动物都想来报名参加。经过投票,他们最 终选出了光头强,赵琳,熊大,熊二,吉吉,毛毛。由于不同动物和人的力量明显是不一样 的,所以这个拔河比赛可能会很不公平。于是他们想每 3 个分成一组,并对每位选手的力量 值做一个适当的估计,力量估计值都是一个正整数。 拔河比赛马上就要开始了,请你根据给出的力量值来判断是否可以分成两组,每组 3 位选手,同时要求每组的力量值总和相等。

输入格式:
第一行是一个正整数 T,表示共计有 T 组数据需要判定。接下对于每组数据, 都是 6 个正整数,表示每位选手的实力,每组数据占一行。

输出格式:
对于每组数据,如果可以分成实力相同的两个队伍,就输出 yes,否则就输出 no,每个 输出占一行。

输入样例1:
1
1 3 2 1 2 1

输出样例1:
yes

输入样例2
2
1 1 1 1 1 99
1 1 1 1 1 1

输出样例2:
no
yes

分析

一开始想的是排序,第一个和最后一个组合,第二个和倒数第二个组合,然后谁大就要第三个小的,谁小用大的第四个。后来找了博文发现有局限性,力量值最大和最小的不一定在一个组中,例:2 3 4 7 7 9 2+7+7=3+4+9
但是在写第一个思路的时候遇到了一些收获:

#include<vector>  //头文件
vector<int> v;    //定义容器
vector<int> v(6);  //定义6个初始值为0的容器,注意此时再v.push_back(nn);的话 
//是在六个0 【后面】加元素,而不是覆盖

vector<int> b(15); // 定义的时候指定vector的⼤大⼩小,默认b⾥里里⾯面元素都是0
for (int i = 0; i < b.size(); i++) {  b[i] = 15; } // 这样就是覆盖了

sort(v.begin(),v.end()); //容器的sort用法

for (auto it = v.begin(); it != v.end(); it++) { // 使用迭代器的方式访问vector        
	cout << *it << " ";    
}  

第二个思路,首先有一个诀窍:如果六个之和%2不为0的话就肯定不能平均分为2份,直接输出no,continue下面的不运行直接进入下一组。关键点就是sum/2 ,固定一个 v[0] 如果for两次求和找到sum/2的组合了,就可以分两份了。flag退出循环有很重要的作用
上代码:

代码

#include<iostream>
using namespace std;

int main(){
	int n,nn;cin>>n;
	while(n--){
		int v[6],sum=0,flag=0;
		for(int i=0;i<6;i++){
			cin>>v[i];
			sum+=v[i];
		} 
		if(sum%2){
			cout<<"no"<<endl;
			continue; 
		} 
		for(int i=1;i<6;i++){
			for(int j=i+1;j<6;j++){
				if(v[0]+v[i]+v[j]==sum/2){  //sum肯定可以被2 整除 
					cout<<"yes"<<endl;
					flag=1;
					break;
				}
			}
			if(flag){
				break;
			} 
		} 
		if(flag==0)cout<<"no"<<endl;
	} 
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DDouble-

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值