zoukankan      html  css  js  c++  java
  • Codeforces Round #383 (Div. 2) 题解【ABCDE】

    Codeforces Round #383 (Div. 2)

    A. Arpa’s hard exam and Mehrdad’s naive cheat

    题意

    求1378^n mod 10

    题解

    直接快速幂

    代码

    #include<bits/stdc++.h>
    using namespace std;
    long long quickpow(long long  m,long long n,long long k)
    {
        long long b = 1;
        while (n > 0)
        {
              if (n & 1)
                 b = (b*m)%k;
              n = n >> 1 ;
              m = (m*m)%k;
        }
        return b;
    }
    
    int main()
    {
        int n;
        scanf("%d",&n);
        printf("%lld
    ",quickpow(1378,n,10));
    }
    

    B - Arpa’s obvious problem and Mehrdad’s terrible solution

    题意

    问里面有多少对数,满足a[i]^a[j]=x,且i<j

    题解

    注意a[i]a[j]=x,那么a[i]x=a[j]

    mp[i]表示大小为i的有多少个,然后不停的去扫,然后ans+=mp[a[i]^x]就好了

    mp的数组得开大一点,因为a[i]^x不一定小于等于100000

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e6+7;
    int n,x,a[maxn];
    int mp[maxn];
    int main()
    {
        scanf("%d%d",&n,&x);
        long long ans = 0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            ans+=mp[a[i]^x];
            mp[a[i]]++;
        }
        cout<<ans<<endl;
    }
    

    C - Arpa's loud Owf and Mehrdad's evil plan

    题意

    x->a[x]->a[a[x]]->.....->y 这样一直循环下去

    题目中需要找到一个最小的t,使得任何一个x经过t步可以到达某一个y,且y也可以经过t步走到x

    题解

    显然就是把所有环都找出来,如果环的大小是偶数的话,那么就让这个环除2,如果这个环的大小为奇数的话,取这个环的大小。

    然后都取最小公倍数就好了

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 105;
    int n,a[maxn],vis[maxn];
    int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int flag=0;
        vector<int>ans;
        for(int i=1;i<=n;i++){
            if(vis[i])continue;
            int now=i;
            int cnt=0;
            while(!vis[now]){
                vis[now]=i;
                now=a[now];
                cnt++;
            }
            if(now!=i)
                return puts("-1"),0;
            if(cnt%2==0)cnt/=2;
            ans.push_back(cnt);
        }
        long long Ans=ans[0];
        for(int i=1;i<ans.size();i++)
            Ans=Ans*ans[i]/gcd(Ans,ans[i]);
        cout<<Ans<<endl;
    }
    

    D - Arpa's weak amphitheater and Mehrdad's valuable Hoses

    题意

    现在有n个人,每个人有w[i]重量的礼物,礼物的魅力值为B[i]

    现在他们组成了一些集体,每个集体要么来一个人,要么就不来,或者全部来

    然后你最多收重量和为W的物品,现在问你能获得的最大魅力值是多少

    题解

    并查集+背包dp,注意这个背包dp不要滚动优化,不然很容易从集体里面转移过来

    题解

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,m,weight,fa[1005],w[1005],b[1005],dp[1005][1005],W[1005],B[1005];
    vector<int>WW[1005],BB[1005];
    int fi(int x){
        return fa[x]==x?x:fa[x]=fi(fa[x]);
    }
    void combine(int x,int y){
        x=fi(x),y=fi(y);
        if(x==y)return;
        fa[x]=y;
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&weight);
        for(int i=1;i<=n;i++)
            fa[i]=i;
        for(int i=1;i<=n;i++)
            scanf("%d",&w[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&b[i]);
        for(int i=1;i<=m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            combine(x,y);
        }
        for(int i=1;i<=n;i++){
            W[fi(i)]+=w[i];
            B[fi(i)]+=b[i];
            WW[fi(i)].push_back(w[i]);
            BB[fi(i)].push_back(b[i]);
        }
        int Ans = 0;
        for(int i=1;i<=n;i++){
            for(int j=0;j<=weight;j++)
                dp[i][j]=dp[i-1][j];
            if(fi(i)!=i)continue;
            for(int j=weight;j>=W[i];j--)
                dp[i][j]=max(dp[i][j],dp[i-1][j-W[i]]+B[i]);
            for(int j=0;j<WW[i].size();j++)
                for(int k=weight;k>=WW[i][j];k--)
                    dp[i][k]=max(dp[i][k],dp[i-1][k-WW[i][j]]+BB[i][j]);
            for(int j=0;j<=weight;j++)
                Ans=max(Ans,dp[i][j]);
        }
        cout<<Ans<<endl;
    }
    

    E - Arpa’s overnight party and Mehrdad’s silent entering

    题意

    有一个环形的桌子,一共有n对情侣,2n个人,一共有两种菜。

    现在让你输出一种方案,满足以下要求:

    1. 情侣间吃不同的菜

    2. 相邻的三个人不能都吃同一种菜

    题解

    将不能吃统一种菜的人连边,发现这个图并不存在奇数长度度的环(显然成立,不然就是三角恋了)

    那么肯定有答案

    然后按照二分图去染色就好了

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 3e5+7;
    int n;
    vector<int> E[maxn];
    int b[maxn],g[maxn],ans[maxn];
    void dfs(int x,int y){
        if(ans[x])return;
        ans[x]=y;
        for(int i=0;i<E[x].size();i++)
            dfs(E[x][i],1-y);
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            E[2*i-1].push_back(2*i);
            E[2*i].push_back(2*i-1);
        }
        for(int i=1;i<=n;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            E[x].push_back(y);
            E[y].push_back(x);
            b[i]=x,g[i]=y;
        }
        int now=0,tmp=0;
        for(int i=1;i<=2*n;i++){
            if(!ans[i])dfs(i,tmp);
        }
        for(int i=1;i<=n;i++)
            cout<<ans[b[i]]+1<<" "<<ans[g[i]]+1<<endl;
    }
  • 相关阅读:
    浮点数越界或者无效1.#IND0
    [转]方差、协方差与相关系数
    『转』 函数、变量命名方法
    感知哈希算法——google用于图片搜索的算法
    C#传值调用与引用调用 解释
    HttpContext.Current.Request.ServerVariab
    怎么去用java经典递归算法?
    泛型的详细解释与示例
    个彻底解释 C#泛型的源代码
    VC++怎么实现Win2000下直接读写磁盘扇区
  • 原文地址:https://www.cnblogs.com/qscqesze/p/6140564.html
Copyright © 2011-2022 走看看