CF1574B Combinatorics Homework

Link

洛谷 & Codeforces

Tag

洛谷:暂无标签

Codeforces:combinatorics,greedy,math

Difficulty Level

洛谷: 暂无评定 \color{grey}{暂无评定} 暂无评定

Codeforces: 1100 \color{grey}{1100} 1100

Solution

首先考虑满足条件的 m m m 的最大值,显然,让字符串按照 a a aA b b bB c c cC 依次排列时 m m m 最大,为 a − 1 + b − 1 + c − 1 = a + b + c − 3 a-1+b-1+c-1=a+b+c-3 a1+b1+c1=a+b+c3

然后考虑 m m m 的最小值,不妨设 a ≤ b ≤ c a \leq b \leq c abc,则 m m m 最小的情况为:

C A C A C A C B C B C B C B C C C . . . CACACACBCBCBCBCCC... CACACACBCBCBCBCCC...

可以得到此时 m m m c − a − b − 1 c-a-b-1 cab1,这个数算出来有可能为负数,即表示 m m m 最小值为 0 0 0

最后我们考虑从最小值到最大值之间的每个 m m m 是否都可以取到。我们从 m m m 最小时的字符串开始,从左往右依次取字符,若取到 C 就将其加入到最后面的一连串 C 中,若取到的第一个 A 将其移到最后,之后取到 A 就将其加入最后面连续的 A 中,BA 同理。

例如, m m m 最小时的字符串如下:

C A C A C A C B C B C B C C C CACACACBCBCBCCC CACACACBCBCBCCC

依次转化如下:

A C A C A C B C B C B C C C C ACACACBCBCBCCCC ACACACBCBCBCCCC

C A C A C B C B C B C C C C A CACACBCBCBCCCCA CACACBCBCBCCCCA

A C A C B C B C B C C C C C A ACACBCBCBCCCCCA ACACBCBCBCCCCCA

C A C B C B C B C C C C C A A CACBCBCBCCCCCAA CACBCBCBCCCCCAA

A C B C B C B C C C C C C A A ACBCBCBCCCCCCAA ACBCBCBCCCCCCAA

C B C B C B C C C C C C A A A CBCBCBCCCCCCAAA CBCBCBCCCCCCAAA

B C B C B C C C C C C C A A A BCBCBCCCCCCCAAA BCBCBCCCCCCCAAA

C B C B C C C C C C C A A A B CBCBCCCCCCCAAAB CBCBCCCCCCCAAAB

B C B C C C C C C C C A A A B BCBCCCCCCCCAAAB BCBCCCCCCCCAAAB

C B C C C C C C C C A A A B B CBCCCCCCCCAAABB CBCCCCCCCCAAABB

B C C C C C C C C C A A A B B BCCCCCCCCCAAABB BCCCCCCCCCAAABB

C C C C C C C C C A A A B B B CCCCCCCCCAAABBB CCCCCCCCCAAABBB

显然,每次可以使得 m m m 增加 1 1 1,最终到达最大值。

所以,若 c − a − b − 1 ≤ m ≤ a + b + c − 3 c-a-b-1 \leq m \leq a+b+c-3 cab1ma+b+c3 m m m 合法,否则不合法。

Code

#include<iostream>
#include<cstdio>
using namespace std;
int a,b,c,m;
void work()
{
	scanf("%d%d%d%d",&a,&b,&c,&m);
	if(m>a+b+c-3)
	{
		printf("NO\n");
		return;
	}
	if(a>c)
		swap(a,c);
	if(b>c)
		swap(b,c);
	if(m<c-a-b-1)
	{
		printf("NO\n");
		return;
	}
	printf("YES\n");
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
		work();
	return 0;
}

Submission

Codeforces submission

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值