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() ;
}

浙公网安备 33010602011771号