B. Combinatorics Homework
题目大意
给出四个数a,b,c,m。
求是否存在一个字符串:
- 存在a 个 ‘A’
- 存在b 个 ‘B’
- 存在c 个 ‘C’
- 除ABC没有其他的字母
- 有m对相邻相等字母(即s[i] = s[i+1] 算作一对)
存在输出"YES",不存在输出"NO"
题目解析
假设
a
=
2
,
b
=
2
,
c
=
6
a = 2, b = 2, c = 6
a=2,b=2,c=6.
则对于所有情况的字符串,其能求得的最多的相邻相等字母对的情况为
A
A
B
B
C
C
C
C
C
C
AABBCCCCCC
AABBCCCCCC 共
a
+
b
+
c
−
3
=
7
a+b+c-3 = 7
a+b+c−3=7 对
其能求得的最少的相邻相等字母对的情况为
C
C
A
C
A
C
B
C
B
C
CCACACBCBC
CCACACBCBC 共
c
−
a
−
b
−
1
=
1
c - a - b - 1 = 1
c−a−b−1=1 对,
若 c − a − b − 1 < = 0 c - a - b - 1 <= 0 c−a−b−1<=0 ,则最少的对数一定为0
也就是说,我们每次将abc进行排序然后带入公式进行计算即可
于是只需要判断m是否在最大与最小之间即可
AC代码
#include <bits/stdc++.h>
// #include <b栈关注>
// #include <嘉然今天吃什么>
// #include <关注嘉然,顿顿解馋>
using namespace std;
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
constexpr int N = 1e5 + 100;
int main() {
io;
int T; cin >> T;
while(T --) {
int a,b,c,m; cin >> a >> b >> c >> m;
int n[] = {a,b,c};
int max,min;
sort(n,n + 3);
min = n[2] - n[1] - n[0] - 1 > 0 ?n[2] - n[1] - n[0] - 1 : 0;
max = n[2] + n[1] + n[0] - 3;
if(m <= max && m >= min)
puts("YES");
else
puts("NO");
}
return 0;
}
END