• 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
    #include
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    Submission

    Codeforces submission

  • 相关阅读:
    【微服务|SCG】Filters的33种用法
    组合拳 | 本地文件包含漏洞+TFTP=Getshell
    计算摄影——图像去噪(一)
    Go 理解零值
    java单例模式
    Pytorch 实战 LESSON 4 张量的线性代数运算
    锂离子电池热失控预警资料整理(一)
    数组和字符串 --- 寻找数组的中心索引
    python爬虫SHA案例:某直播大数据分析平台
    GE IS220PAICH2A 336A4940CSP11 控制脉冲模块
  • 原文地址:https://blog.csdn.net/Wu_while/article/details/126124678