Codeforces Round #698 (Div. 2) AB

71 篇文章 1 订阅
这篇博客探讨了两个算法问题:一是如何在给定升序排列的数字中,使用最少的颜色使得某颜色数字保持严格递增;二是如何判断一个数是否为好数,即能否由含特定数字的数组成。解决方案分别涉及到了计数和数学规律的运用。
摘要由CSDN通过智能技术生成

A

给一排升序排序的数字,给数字涂色,要求去掉某个颜色之外的所有数,该颜色的数,呈严格递增,就是不重复的升序。
只有一个数的时候也符合题意。
要求使用最少的颜色数。

题解思路

就是记录出现次数最多的数。

AC代码
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int vis[200];
int main ()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(vis , 0 , sizeof(vis) );
        int n,ans = 0 ;
        cin>>n;
        for (int i = 1 ; i <= n  ; i++ )
        {
            int p;
            cin>>p;
            vis[p]++;
            if ( vis[p] > ans )
                ans = vis[p];
        }
        cout<<ans<<"\n";
    }
    return 0;
}

B

给出一个数D , 再给出数 Q,如果Q能被含D的数 组成 ,这称这个数是好数。多个好数之和也是好数
判断一个数是否是好数。

题解思路

想搜索,但是1e9必然超时
所以,没思路了。

结果发现可以找规律的。
在这里插入图片描述
当小于10D的时候,判断X是否满足 10a+bd ,直接对数取模出个位,和取出位10的几倍。
当个位不为D的倍数时,尝试不断从10倍数借位,因为bd是有可能大于10 的。

参考大佬的题解

AC代码
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int main ()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n , d ;
        cin>>n>>d;
        for (int i = 1 ; i <= n  ; i++ )
        {
            int p ;
            cin>>p;
            if ( p >= 10*d)
            {
                cout<<"YES\n";
            }else
            {
                int t1 = p/10;
                p = p%10;
                if ( p != 0 && p % d == 0  )
                {
                    cout<<"YES\n";
                    continue;
                }else
                {
                    int flag = 0;
                    while(t1)
                    {
                        t1--;
                        p += 10;
                        if ( p % d == 0 )
                        {
                            flag = 1;
                            break;
                        }
                    }
                    if (flag)
                        cout<<"YES\n";
                    else
                        cout<<"NO\n";
                }
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值