Codeforces 1574B -Combinatorics Homework

Codeforces 1574B -Combinatorics Homework

题目大意:

​ 有三种字母A、B、C的数量(分别是a、b、c),和一个数字m。问能不能用这三种字母构造一个字符串使得该串中只有m个位置满足s[i] == s[i + 1]。

思路:

​ u1s1,cf上的低分题很多都是贪心。给定abc,我们可以算出来M的最大值和最小值,只要判断m在不在这个范围内就行了。要最大化M,只要把一样的排在一起就好;要最小化M,就需要把最多的一字排开然后将另外两个插空。毕竟贪就完了~

代码:

#include<bits/stdc++.h>
#define debug cout<<"= =\n"

/*
=========> A Tyrion Project . 
*/

using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f;
const ll N = 2*1e6+1000;
const ll mod = 1e9 + 7 ;

void solve(){
	
	int a , b , c , m ;
	
	cin>>a>>b>>c>>m ;
	
	if(a > c)swap(a , c) ;
	if(b > c)swap(b , c) ;
	if(a > b)swap(a , b) ;//使得c>b>a,方便后面算minn
	
	int maxx = a + b + c - 3 ;
	int minn = c - b - a - 1 ;
	
	if(m > maxx || m < minn)cout<<"NO\n" ;
	else cout<<"YES\n" ;

}

int main(){
	
	ios::sync_with_stdio(false) ;
	//freopen("inn.in","r",stdin) ;
	ll T;
	cin>>T;
	while(T -- )solve() ;
		
}
posted @ 2021-09-23 19:13  tyrii  阅读(102)  评论(0)    收藏  举报