A. Boboniu Likes to Color Balls(枚举情况判断或巧方法解决)Codeforces Round #664 (Div. 2)

原题链接:https://codeforces.com/contest/1395/problem/A

题意: 给你四个颜色球所对应的数量,其中一个红球+一个绿球+一个蓝球组合在一起可以换3个白球。你可以进行若干次换的次数。若你能将这些颜色球按任意顺序排列形成一个回文,则输出"Yes",否则输出"No"。

解题思路: 此题我比赛的时候用的方法比较笨,但还是说一下我的思路。我们最初可以得到4个颜色球所对应的数量,我们又知道形成回文的要求就是颜色球中最多只有一个球的数量为奇数。所以我们就是要通过该操作来达成我们的目的。所以我们对出现的情况进行分析即可。即一开始统计所有颜色球的奇偶数量。然后分别对这种进行判断。具体看AC代码。写了详细注释。
那么还有一种思路也是判断,只不过这个更加简便一点,也更高效,推荐学习第二种方法。具体看代码。(写了详细注释。)

笨办法AC代码:

/*
*邮箱:[email protected]
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include	//POJ不支持

#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//

int main(){
	//freopen("in.txt", "r", stdin);//提交的时候要注释掉
	IOS;
	ll t,a[4];
	while(cin>>t){
		while(t--){
			cin>>a[0]>>a[1]>>a[2]>>a[3];
			int cnt=0;
			sort(a,a+3);//排序,获得最小的。
			//统计获取现有的奇偶情况。
			if(a[0]%2)cnt++;
			if(a[1]%2)cnt++;
			if(a[2]%2)cnt++;
			if(a[3]%2)cnt++;
			if(cnt<=1){
				//一开始就满足我们的要求。
				cout<<"Yes"<<endl;
				continue;
			}
			if(cnt==2){
				//存在两个为奇数这种我们怎么变都不可能,因为我们换了之后仍然会存在两个奇数。
				cout<<"No"<<endl;
			}
			//关键是存在三个奇数的球数量。
			else if(cnt==3&&a[3]%2==0){
				//若白球为偶数,那么说明其余三个颜色球均为奇数,所以我们进行一次换球操作。就可以使三个为偶数,白球为奇数,满足。
				cout<<"Yes"<<endl;
			}
			else if(cnt==3&&a[3]%2){
				if(a[0])
				//如果白球为奇数,那么我们判断最小的是否有球,我们进行一次换球操作,就可以使白球为偶数,其他三个两个为偶数,一个为奇数。
					cout<<"Yes"<<endl;
				else
				//三个颜色球其中一个为0,无法换球,
					cout<<"No"<<endl;
			}
			//都为奇数,我们进行一次换球之后就都为偶数,自然可以。
			else if(cnt==4)
				cout<<"Yes"<<endl;
		}
	}
	return 0;
}

巧方法AC:

/*
*邮箱:[email protected]
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include	//POJ不支持

#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair

using namespace std;

const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll>  pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//

int main(){
	//freopen("in.txt", "r", stdin);//提交的时候要注释掉
	IOS;
	ll t,a[4];
	while(cin>>t){
		while(t--){
			cin>>a[0]>>a[1]>>a[2]>>a[3];
			if((a[0]&1)+(a[1]&1)+(a[2]&1)+(a[3]&1)<=1){
				//如果奇数数量的球小于等于1,则满足要求。
				cout<<"Yes"<<endl;
			}
			else{
				//判断这三个颜色球是否可以进行换球操作。
				if(a[0]&&a[1]&&a[2]){
					a[0]--;a[1]--;a[2]--;a[3]+=3;
					if((a[0]&1)+(a[1]&1)+(a[2]&1)+(a[3]&1)<=1){
					//如果奇数数量的球小于等于1,则满足要求。
						cout<<"Yes"<<endl;
					else 
					//如果不行我们再换是没必要的,因为再换一次回到了输入时候的状态。
						cout<<"No"<<endl;
					}
				}
				else 
					cout<<"No"<<endl;
			}
	}
	return 0;
}

你可能感兴趣的:(#,CF,闲来无事爱取巧,枚举)