Educational Codeforces Round 59 (Rated for Div. 2)(ABCD)

Posted lin1874

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 59 (Rated for Div. 2)(ABCD)相关的知识,希望对你有一定的参考价值。

A. Digits Sequence Dividing

题意:给你一个数字串,只包含1-9,让你至少分成两段,使得每一段的数字大于前一段的数字;

解:对n特判,如果n为2,那么比较一下两个数字大小,如果n>2,那么就可以直接分成两部分,第一部分1个数字,剩下都为第二部分;

技术图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+10;
const int mod=998244353;
ll ans[maxn];
int main()
    int T;
    cin>>T;
    while(T--)
        int n;
        string s;
        cin>>n>>s;
        if(n==2)
            if(s[0]<s[1])
                cout<<"YES"<<endl;
                cout<<"2"<<endl;
                cout<<s[0]<< <<s[1]<<endl;
            
            else cout<<"NO"<<endl;
        
        else 
            cout<<"YES"<<endl;
            cout<<"2"<<endl;
            cout<<s[0]<< ;
            for(int i=1;i<n;i++)cout<<s[i];
            cout<<endl;
        
 
    
 
 
    return 0;
View Code

B. Digital root

题意:给你一个S(x),让你求第k个x;S(5)=5,S(38)=S(3+8=11)=S(1+1=2)=2;

比如从5 1   有:1 10 19 28 37 46 发现规律:m+(n-1)*9

解:写几个推下公式就蒙过去了

技术图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+10;
 
int main()
    int T;
    cin>>T;
    while(T--)
        ll n,m;
        cin>>n>>m;
        cout<<9LL*(n-1)+1LL*m<<endl;
    
 
    return 0;
View Code

C. Brutality

题意:一个字符串,26个字母,每个位置的字母都有一个价值,连续字母出现不能超过k次,如果超过的需要删除掉,问你能获得的最大价值是多少;

解:暴力咯,把连续相同的字母放在优先队列里面,然后不连续之后从队列里面拿出k个,其他的都不要。

技术图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll a[maxn];
priority_queue<int>que;
int main()
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin>>a[i];
    
    string s;
    cin>>s;
    que.push(a[0]);
    ll ans=0LL;
    for(int i=1;i<n;i++)
        if(s[i]==s[i-1])
            que.push(a[i]);
        
        else
            int cnt=0;
            while(!que.empty())
                if(cnt>=m)break;
                ans+=que.top();que.pop();
                cnt++;
            
            while(!que.empty())que.pop();
            que.push(a[i]);
        
    
    int cnt=0;
    while(!que.empty())
        if(cnt>=m)break;
        ans+=que.top();que.pop();
        cnt++;
    
    while(!que.empty())que.pop();
    cout<<ans<<endl;
 
 
 
 
 
    return 0;
View Code

D. Compression

题意:(自己做的时候还看不懂题意)看了下题解,原来是求把矩阵A能分成最大的矩阵B,满足矩阵B的长度能够被A的长度整除,

且A种B的规格的块要么满足都为1,要么满足都为0才行;

解:把二维前缀和先预处理一下,然后再去枚举n到1矩阵的规格,利用二维前缀和可以快速判断是否满足条件;

技术图片
#include <bits/stdc++.h>
using namespace std;
const int maxn=5300;
int a[maxn][maxn],pre[maxn][maxn];
string s;
int n;
bool check(int x)
    for(int i=0;i<n;i+=x)
        for(int j=0;j<n;j+=x)
            int now=pre[i+x][j+x]+pre[i][j]-pre[i+x][j]-pre[i][j+x];
            if(now!=0&&x*x!=now)
                return false;
            
        
    
    return true;

int main()
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>s;
        for(int j=0;j<n/4;j++)
            int x=0;
            if(s[j]>=A&&s[j]<=Z)
                x=10+s[j]-A;
            else x=s[j]-0;
            a[i][4*j+3]=x>>0&1;
            a[i][4*j+2]=x>>1&1;
            a[i][4*j+1]=x>>2&1;
            a[i][4*j+0]=x>>3&1;
        
    
    /*for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cout<<a[i][j]<<‘ ‘;
        
        cout<<endl;
    */
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            pre[i+1][j+1]=pre[i][j+1]+pre[i+1][j]-pre[i][j]+a[i][j];
        
    
    for(int i=n;i>=1;i--)
        if(n%i==0)
            if(check(i))
                cout<<i<<endl;
                return 0;
            
        
    
 
 
    return 0;
View Code

 

以上是关于Educational Codeforces Round 59 (Rated for Div. 2)(ABCD)的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 7 A

Educational Codeforces Round 7

Educational Codeforces Round 90

Educational Codeforces Round 33

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 27