首页 > 其他分享 >Codeforces Round 903 (Div. 3) ABCDE

Codeforces Round 903 (Div. 3) ABCDE

时间:2023-11-10 17:01:22浏览次数:36  
标签:903 const int nullptr ll ABCDE cin Div dp

Codeforces Round 903 (Div. 3)ABCDE

A. Don't Try to Count

题意:复制\(s\)串若干遍,是否能在\(s\)串中找到\(t\)串。

思路:直接暴力,注意不要超限,会MLE

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int ns[30],nt[30];
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t; cin>>t;
    while(t--)
    {
        int n,m; cin>>n>>m;
        string s,t; cin>>s>>t;
        
        for(int i = 0;i <= 30; i++)
            ns[i] = nt[i] = 0;
        for(int i = 0;i < n; i++)
            ns[s[i]-'a']++;
        for(int i = 0;i < m; i++)
            nt[t[i]-'a']++;

        bool ok = true;
        for(int i = 0;i < 26; i++)if(nt[i]&&!ns[i]){
            ok = false;
            break;
        }

        if(!ok)
            cout<<"-1\n";
        else{
            bool ok = false;
            int cnt = 0;
            while(1)
            {   
                if(cnt>10)break;
                if(s.find(t) != string::npos)
                {
                    ok = true;
                    break;
                }
                s = s + s;
                cnt++;
            }
            if(ok)cout<<cnt<<"\n";
            else cout<<"-1\n";
        }
    }
    return 0;
}

B. Three Threadlets

题意:给你3根绳子,问你能否在3刀以内(可以为0刀),使得所有绳子一样长。

思路:分析一下,我们最终一定会变成当前最短的,如果变不成,那一定不行。因为如果不变成当前最短的,那么意味着当前最短的要被切,那么其他的不可能在剩余2刀之内切成一样,除非原本三个都和最短的一样长。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t; cin>>t;
    while(t--)
    {
        ll a,b,c;
        cin>>a>>b>>c;
        ll minn = min({a,b,c});
        if(a%minn||b%minn||c%minn)
            cout<<"No\n";
        else{
            int ans = 0;
            if(a!=minn)
                ans += a/minn-1;
            if(b!=minn)
                ans += b/minn-1;
            if(c!=minn)
                ans += c/minn-1;

            if(ans>3)
                cout<<"No\n";
            else cout<<"Yes\n";

        }
    }
    return 0;
}

C. Perfect Square

题意:给你一个初始矩阵,问你如果要该矩阵旋转90°之后和原来的一样,最少要操作多少次。每次操作可以选择一个让他变成下一个(z的话就不变了)

思路:旋转后\(a[i][j],a[j][N-i+1],a[N-i+1][N-j+1],a[N-j+1][i]\)是要一样的,那么,我们考虑变成这四个中最大的(因为只能往大的变),统计答案即可。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
char s[1010][1010];
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t; cin>>t;
    while(t--)
    {
        int n; cin>>n;
        for(int i = 1;i <= n; i++)
            for(int j = 1;j <= n; j++)
                cin>>s[i][j];
        ll ans = 0;
        int m = n/2;
        /*
            a[i][j] -> a[j][N-i+1]
             ↑             ↓
            a[N-j+1][i]<-a[N-i+1][N-j+1]
        */
        for(int i = 1;i <= m; i++)
        {
            for(int j = i; j < n-i+1; j++)
            {
                char a[4] = {s[i][j],s[j][n-i+1],s[n-i+1][n-j+1], s[n-j+1][i]};
                char mx = a[0];

                for(int k = 1;k < 4; k++)
                    mx = max(mx,a[k]);
                for(int k = 0;k < 4; k++)
                    ans += mx-a[k];
            }
        }
        cout<<ans<<"\n";
        
    }

    return 0;
}
    

D. Divide and Equalize

题意:给你一个数组\(a\)包含\(n\)个正整数。每次你可以选择任意两个元素\(a_i,a_j\),然后让\(a_i/x,aj*x\)(这里\(x\)整除\(a_i\))。问能否使得所有元素都变得一样。

思路:根据唯一分解定理,我们对每个数进行质因数分解。最后我们的每种质因子一定要可以平均分配才能使得所有数一样。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int a[N];
map<int,int>mp;
void primer(ll x)
{
    for (ll i = 2; i <= x / i; i++)
    {
        if (x % i == 0)
        {
            int s = 0;
            while (x % i == 0)
            {
                x = x / i;
                s++;
            }
            mp[i]+=s;
        }
    }
    if (x > 1)mp[x]++;
}

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t; cin>>t;
    while(t--)
    {
        mp.clear();
        int n; cin>>n;
        for(int i = 1;i <= n; i++)
            cin>>a[i],primer(a[i]);

        bool ok = true;
        // for(auto [x,c]:mp)
        //     cout<<x<<" "<<c<<"\n";
        for(auto [x,c]:mp)if(c%n&&x!=1){
            ok = false;
            break;
        }

        if(ok)cout<<"Yes\n";
        else cout<<"No\n";

    }
    return 0;
}

E. Block Sequence

题意:给你一个序列\(a\)长度为\(n\)。我们定义:我们可以把元素分成第一个元素长度的块的叫做美丽数组。问最少操作多少次能变得美丽。

思路:dp。我们知道,当前的和后面的有关,我们考虑倒着dp。

定义:\(dp[i]\):\(i~n\)最少删多少个是美丽的。

转移:

考虑删掉:\(dp[i] = dp[i+1]+1\)

考虑保留:\(if(i+a[i]\le n) dp[i] = dp[i+a[i]+1]\)

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
ll a[N],dp[N];
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t; cin>>t;
    while(t--)
    {
        int n; cin>>n;
        for(int i = 1;i <= n; i++)
            cin>>a[i];
        dp[n] = 1,dp[n+1] = 0;
        for(int i = n-1;i >= 1;i--)
        {
            dp[i] = dp[i+1]+1;//删除
            if(a[i]<=n-i)//保留
                dp[i] = min(dp[i],dp[i+a[i]+1]);
        }
        cout<<dp[1]<<"\n";
    }
    return 0;
}

标签:903,const,int,nullptr,ll,ABCDE,cin,Div,dp
From: https://www.cnblogs.com/nannandbk/p/17824498.html

相关文章

  • Codeforces Round 908 (Div. 2)
    比赛链接A.SecretSport题解O(1*T)对于一场比赛,结束前谁最后赢就是谁赢#include<bits/stdc++.h>usingnamespacestd;strings;voidsolve(){intn;cin>>n>>s;cout<<s[n-1]<<endl;}intmain(){intT;cin>>T......
  • Educational Codeforces Round 126 (Rated for Div. 2)
    https://codeforces.com/contest/1661/B题数据很小,直接bfs预处理就行C题随便猜了一下,设mx=\(max\{a_i\}\)最后的值应该是mx,mx+1,mx+2,mx+3之类的吧D题刚开始从前面考虑,陷入僵局,一度非常的困,学习凯库勒睡了一会,就突然想到了,前面不行,就从后面考虑,可以发现,从后面考虑的话,就非常......
  • 11月9月字体的属性2以及div模块的另一种用法
    目录字体的属性2文字对齐文字的装饰首行缩进文字的距离设置块级标签的另一个作用字体的属性2文字对齐、文字装饰、首行缩进、文字之间的距离文字对齐需要用到属性text-align,该属性是用于规定元素中的文本水平对齐方式。然后就是text-align的属性值:值描述left左边......
  • cf908(div2)题解(补题)
    纪念这次div2让我上绿名,但还是有点遗憾,差一点就可以过三题超神了比赛链接cf908div2A这题是个骗人题,整个比赛会停下来就是一个人赢够了回合数,那么在谁这停下来就是谁赢了整个比赛,不用管每回合赢得规则。#include<iostream>usingnamespacestd;#include<string>intmain(){......
  • Codeforces Round 908 (Div. 2)
    A.SecretSport题意:A与B选手在下棋,规定下赢X把看作赢一局,一共赢Y把的那个是最后的赢家。思路:因为不知道x,y到底是多少,n的范围是到20,所以只需要枚举x即可,时间复杂度不高,注意的是,如果枚举结果是A赢,那么给定字符串的最后一个值一定是A,反之也是。#include<bits/stdc++.h>usingnam......
  • 2008秋季-计算机软件基础-0903课堂用例(1)
    #include<stdio.h>voidupdate(intxiabiao,intb[],intxinshu);voidcharu(intweizhi,intb[],intcharushu,intshuzuchang);voidshanchu(intweizhi,intb[],int*changdu);voidshuchu(intaa[],intbiaochang);voidchazhao(int......
  • 相对熵/KL散度(Kullback–Leibler divergence,KLD)
    相对熵(relativeentropy)又称为KL散度(Kullback–Leiblerdivergence,简称KLD),信息散度(informationdivergence),信息增益(informationgain)。KL散度是两个概率分布P和Q差别的非对称性的度量。     KL散度是用来度量使用基于Q的编码来编码来自P的样本平均所需的额外的比特个......
  • CSS让子元素div的高度填满父容器的剩余空间的方法
    原帖:https://pythonjishu.com/unbayyjtzdjeewe/以下是详细讲解CSS让子元素div的高度填满父容器的剩余空间的方法的完整攻略。方法一:FlexboxFlexbox是一种强大的布局方式,使用起来非常方便。可以通过设置父元素的display属性为flex来开启flexbox布局,然后设置子元素的......
  • Educational Codeforces Round 157 (Rated for Div. 2)
    A.TreasureChest题目大意:人在0处,宝藏在x,钥匙在y,人最多拿宝箱z秒,问你最快多久开宝箱?思路:如果说钥匙在宝箱的左边,那么人只需要往右走就是最佳答案,如果钥匙在宝箱的右边,那么人只需要拿的宝箱到最佳地点就行#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intx,y......
  • Educational Codeforces Round 157 (Rated for Div. 2)
    F.FancyArrays第一眼感觉是去容斥掉条件1,因为条件2其实挺紧的。不妨用\(f(l,r)\)表示\(a\)值域在\([l,r]\)的方案(满足条件2)。那么答案为\(f(0,+\infty)-f(0,x-1)-f(x+k,+\infty)\),因为如果选了\([0,x-1]\)的数,那么还要更大的话,一定会选到\([x,x+k-1]\),所以你要......