题目
思路
我们已知要
m
m
m个位置
i
i
i使得
s
i
=
s
i
+
1
s_i = s_{i+1}
si=si+1,那么我们就需要m+1个字母。
我们先得到已知的
a
,
b
,
c
a,b,c
a,b,c的数量可以形成多少个这样的序列,判断是否大于等于要求的
m
m
m。
然后我们从数目最大的那一堆字母里面取出
m
+
1
m+1
m+1个来形成满足
s
i
=
s
i
+
1
s_i = s_{i+1}
si=si+1的字符串,接着判断取出的那一堆字母剩下的字母是否小于其他没取的字母的数量。如果都满足,那么就输出
Y
E
S
YES
YES,否则输出
N
O
NO
NO。
如果没理解到可以参考以下代码
代码
#include <iostream>
#include <algorithm>
#include <cmath>
#include<vector>
#include <cstring>
#define ll long long
#define ull unsigned ll
#define INF 0x7fffffff
using namespace std;
const int N = 1e5 + 5;
void solve()
{
int t;
cin>>t;
while(t--){
int a, b, c, m;
cin>>a>>b>>c>>m;
int sum = a+b+c;
if(a-1+b-1+c-1 >= m&&max(a,max(b,c))-m-1<=sum-max(a,max(b,c))){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
}
int main()
{
solve();
return 0;
}