涂色游戏color(【CCF】NOI Online 能力测试2 提高组第一题 )

子序列问题sequence(【CCF】NOI Online能力测试2 提高组第二题 )
游戏match(【CCF】NOI Online能力测试2 提高组第三题 )

题目背景

1s 256M

题目描述

你有 1020个格子,它们从 0 开始编号,初始时所有格子都还未染色,现在你按如下规则对它们染色:
编号是 p1 倍数的格子(包括 00 号格子,下同)染成红色。
编号是 p 2倍数的格子染成蓝色。
编号既是 p1倍数又是 p 2倍数的格子,你可以选择染成红色或者蓝色。
其中 p1和 p2是给定的整数,若格子编号是 p1或 p2的倍数则它必须要被染色。在忽略掉所有未染色格子后,你不希望存在 kk 个连续的格子颜色相同,因为你认为这种染色方案是无聊的。现在给定 p1 , p2, k,你想知道是否有一种染色方案不是无聊的。

输入格式

本题包含多组数据。

第一行一个整数 T表示数据组数。

每组数据一行三个正整数 p1 , p2 , k,变量意义见题目描述。

输出格式

对于每组数据,输出一行一个字符串,若存在一种染色方案不是无聊的,则输出 YES,否则输出 NO。

选手程序输出结果与样例或题面中的一种格式相符即可,即不区分大小写。例如,如果标准答案为 YES ,则输出结果 YES/Yes/yes 都视为正确。

输入样例

4
2 10 4
2 3 6
1 4 7
1 1 2

输出样例

No
Yes
Yes
Yes

输入样例

8
370359350 416913505 3
761592061 153246036 6
262185277 924417743 5
668232501 586472717 2
891054824 169842323 6
629603359 397927152 2
2614104 175031972 68
924509243 421614240 4

输出样例

Yes
Yes
Yes
No
No
No
Yes
Yes
《涂色游戏color(【CCF】NOI Online 能力测试2 提高组第一题 )》

思路分析:

1.设p1<p2,且互质,如果不互质,两边除 gcd(p1,p 2) 即可,
则最坏的情况,也就是从 kp2+1 到 (k+1)p2-1这个连续串内塞 p1所对应的颜色,这样就有(p2-2)/p1+1 个连续块,将其与 k比较即可。
2.注意,当k=1时,无论怎么涂都是No!!!

C++代码如下:

#include <iostream>
using namespace std;
long long p1,p2,k,t;
long long gcd(long long a,long long b)
    return !b?a:gcd(b,a%b);
int main()
{ 
	cin>>t; 
    while (t--)
    { 
        cin>>p1>>p2>>k;
        if (k==1)
        { 
            cout<<"NO"<<endl;
            continue;
        }
        if (p1>p2)
            swap(p1,p2);
        long long x=gcd(p1,p2);
        p1/=x;
        p2/=x;
        if(p2>2 && (p2-2)/p1+1>=k)
        	cout<<"NO"<<endl;
        else
        	cout<<"YES"<<endl;
    } 
    return 0;
}

其他的想法

算法一

• 当 格 子 数 到 达 Icm(p1,p2)时,如果在0〜lcm(p1,p2)中搜到
一种方案使得涂色不无聊,后面的格子可以效仿 0 ~ lm( p1 , p2 )来 涂 色 使 得 所 有 的 格 子 都 不 无 聊 。 ( 就 是 格
子的染色方案有循环的意思)
•可以暴力了!
•枚举每一个既可以涂红色又可以涂蓝色的格子的颜色。
• 时间复杂度:O(T*2max(p1,p2))
• 期望得分:15分

算法二

•考虑不那么暴力的做法
• 发 现 最终 连 续 的 颜 色 一 定 是 间 距 较 小 的 那 个 。
•间距较大的两个颜色之间一定会涂上一个间距较小的颜色从而将间距较大的颜色隔幵
• 那 么 既可 以 涂 红 色 又 可 以 涂 蓝 色 的 格 子 一 定 染 上 的 是 间较大的颜色。这样可以尽可能的断开所有染上间隔较小的颜色的格子从 而使得连续段最短 。
• 如 何 判 定 ? 暴 力 出 1~lm( p1 , p2 ) 的格子的颜色 , 然后直数颜色就可以了。
• 时间复杂度:O(T*lcm(p1,p2))
• 期望得分:25分

算法三

•我们可以设p1>p2
•根据算法二,发现红色之间的蓝色个数可以直接计算
•时间复杂度:O(T*min(p1,p2))
•期望得分:60分

算法四

• 同 样 , 我 们 设 p1>p2
•其实我们只需要求出两种颜色什么吋候相邻的最小而又不重叠。 这 吋候是最有可能出现连续的k个蓝色的 ,因为我们只关心间隔中最大的蓝色数量。
• 等 价 ax-by=c(等同于ax mod b= c) 求 c的 M小值(c>0)
•看到这个式子,或许会想到扩展欧几里得算法
• 要 使 得 这个式子有解需要满足gcd( a, b)|c ( 贝 祖 定 理 )
• 所 以 这 里 的 c最 小 值 就 是 gcd( a, b) 。
• 最后就是判定当与上一个的间隔为gcd( a, b) 时是否满足条件。
•时间复杂度:O(Tlogn)
•期望得分:100分

    原文作者:
    原文地址: https://blog.csdn.net/weixin_45884316/article/details/105748028
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞