zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 89 (Rated for Div. 2)

    Educational Codeforces Round 89 (Rated for Div. 2)

    这套题总的来说都不是很难,和昨天写的那套有一定的相似程度,就是算法比较少,思维比较多。
    A B 没有昨天做的那么顺,还是卡了一会,尤其是B,还把题目看错了
    C 题倒是做的比较顺,但是花的时间还是长了一点点
    D 题不是很难,花的时间过于多了,导致E题结束之后才写完
    这场的ABCDE都可以补一下,没什么算法,主要靠思维+细心观察
    

    A. Shovels and Swords

    这个假设 (x) 个 sword,(y) 个 shovel,

    那么最后就是 (2*x+y<=a) (x+2*y<=b) 所以 (x+y<=(a+b)/3)

    所以就可以把 (x+y) 求出来了,但是注意要和 (a、b) 取一个min。

    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define inf64 0x3f3f3f3f3f3f3f3f
    #define debug(x) printf("debug:%s=%d
    ",#x,x);
    //#define debug(x) cout << #x << ": " << x << endl
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn = 5e5+10;
     
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            int n,m;
            scanf("%d%d",&n,&m);
            int ans=min((n+m)/3,min(n,m));
            printf("%d
    ",ans);
        }
        return 0;
    }
    

    B. Shuffle

    题目大意:

    首先在 (x) 位置有一个1,你有 (m) 次操作,对于第 (i) 次操作,你可以交换 ([li,ri]) 的任意两个数,注意这两个数可以相同,也就是说你可以不进行交换。问最后可以出现1的位置有多少个?

    题解:

    这个其实就是一个区间不断往外扩展,第一次的区间就是 ([x,x]) ,之后的操作区间如果和之前得到的区间有重叠,那么就可以加入之前的这个区间,最后输出区间的长度即可。

    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define inf64 0x3f3f3f3f3f3f3f3f
    #define debug(x) printf("debug:%s=%d
    ",#x,x);
    //#define debug(x) cout << #x << ": " << x << endl
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn = 5e5+10;
     
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            int n,x,m;
            scanf("%d%d%d",&n,&x,&m);
            int l=x,r=x;
            for(int i=1;i<=m;i++){
                int a,b;
                scanf("%d%d",&a,&b);
                if((a<=r&&a>=l)||(b<=r&&b>=l)||(b>=r&&a<=r)) {
                    l=min(l,a);
                    r=max(r,b);
                }
            }
            printf("%d
    ",r-l+1);
        }
    }
    

    C. Palindromic Paths

    题目大意:

    给你一个 (n*m) 的矩阵,从 ((1,1)) 开始走,每一步只能往右或者往下走,最后走到 ((n,m)) ,给你这个矩阵每一个位置的值,这个值取0或者1,你可以对这个矩阵的值进行改变,问最少改变多少个值,可以让第一步的位置和最后一步的位置的值相同,第二步的位置和倒数第二个位置的值相同,以此类推。

    题解:

    这个不好讲,看代码吧

    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define inf64 0x3f3f3f3f3f3f3f3f
    #define debug(x) printf("debug:%s=%d
    ",#x,x);
    //#define debug(x) cout << #x << ": " << x << endl
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn =55;
    int a[maxn][maxn],num[110],sum[110];
     
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            int n,m,now=0;
            memset(sum,0,sizeof(sum));
            memset(num,0,sizeof(num));
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
            for(int i=1;i<=n;i++){
                int x=i,y=1;
                ++now;
                while(true){
                    sum[now]++;
                    if(a[x][y]) num[now]++;
                    x--,y++;
                    if(x<1||y>m) break;
                }
            }
            for(int i=2;i<=m;i++){
                int x=n,y=i;
                ++now;
                while(true){
                    sum[now]++;
                    if(a[x][y]) num[now]++;
                    x--,y++;
                    if(x<1||y>m) break;
                }
            }
            int ans=0;
    //        printf("now=%d
    ",now);
            for(int i=1;i<=now/2;i++){
                ans+=min(num[i]+num[now-i+1],sum[i]+sum[now-i+1]-num[i]-num[now-i+1]);
    //            printf("i=%d ans=%d
    ",i,ans);
            }
            printf("%d
    ",ans);
        }
    }
    

    D. Two Divisors

    这个不是很难,仔细分析吧。

    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define inf64 0x3f3f3f3f3f3f3f3f
    #define debug(x) printf("debug:%s=%d
    ",#x,x);
    //#define debug(x) cout << #x << ": " << x << endl
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn =4e3;
    int phi[maxn],pri[maxn],cnt,v[maxn];
    void init() {
        cnt = 0;
        phi[1] = 1;
        memset(v,0,sizeof(v));
        for (int i = 2; i < maxn; ++i) {
            if (!v[i]) {
                v[i] = i;
                pri[cnt++] = i;
            }
            for (int j = 0; j < cnt; ++j) {
                if (1ll * i * pri[j] >= maxn) break;
                v[i * pri[j]] = pri[j];
            }
        }
    }
    int a[500005],ans1[500005],ans2[500005];
    int gcd(int x,int y){
        return y==0?x:gcd(y,x%y);
    }
    int main(){
        int n;
        init();
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int x,f=0;
            scanf("%d",&x);
            int y=x;
            for(int j=0;j<cnt;j++){
                while(x%pri[j]==0){
                    f = pri[j];
                    x/=pri[j];
                }
                if(f) break;
            }
            if(!f) f=x,x=1;
            ans1[i]=x,ans2[i]=f;
            if(ans1[i]==1||ans2[i]==1||gcd(ans1[i]+ans2[i],x)!=1) ans1[i]=ans2[i]=-1;
        }
        for(int i=1;i<=n;i++) printf("%d ",ans1[i]);
        printf("
    ");
        for(int i=1;i<=n;i++) printf("%d ",ans2[i]);
        printf("
    ");
    }
    

    E. Two Arrays

    这个你首先要判断有没有方案,如果有方案则求出每一个区间的最小区间,然后用组合数求解。

    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define inf64 0x3f3f3f3f3f3f3f3f
    #define debug(x) printf("debug:%s=%d
    ",#x,x);
    //#define debug(x) cout << #x << ": " << x << endl
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int maxn =2e5+10;
    const int mod = 998244353;
    int l[maxn],r[maxn];
    int a[maxn],b[maxn];
    struct node{
        int v,id;
        node(int v=0,int id=0):v(v),id(id){}
        bool operator<(const node & a)const {
            return a.v<v;
        }
    };
    priority_queue<node>que;
    map<int,int>mp;
    int main(){
        int n,m,f=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]),que.push(node(a[i],i));
        for(int i=1;i<=m;i++) scanf("%d",&b[i]);
        b[m+1]=inf;
        for(int i=1;i<=m;i++){
            while(!que.empty()){
                node u = que.top();
    //            printf("u.v=%d
    ",u.v);
                if(u.v<b[i+1]) r[i]=max(r[i],u.id),que.pop();
                else break;
            }
            if(!r[i]) f=1;
        }
        for(int i=1;i<=n;i++){
            if(a[i]<b[1]) f = 1;
            mp[a[i]]=i;
        }
    //    debug(f);
        for(int i=1;i<=m;i++) {
            l[i]=mp[b[i]];
            if(!l[i]) f = 1;
            if(l[i]>r[i]) f = 1;
            if(l[i]<=r[i-1]) f = 1;
        }
        l[1]=1;
        if(f) printf("0
    ");
        else{
            ll ans = 1;
            for(int i=2;i<=m;i++){
                ll res = l[i]-r[i-1];
                ans=res*ans%mod;
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    关于I2C的重要的结构体
    写一个简单的hello字符驱动模块
    Linux设备号
    创建一个简单的TCP服务器
    使用fork循环创建子进程
    vim自动添加头文件
    运行时多态的最终奥义:虚函数的妙用
    springboot的热部署之代码配置(一)
    对github上面的项目进行更新
    eclipse中安装git项目的运行
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/13278573.html
Copyright © 2011-2022 走看看