zoukankan      html  css  js  c++  java
  • CodeForce 814B

    CodeForce 814B

    题意:给长度为n的两个序列a,b,找出一个序列c使得序列c分别与a,b序列相差一个数

    长度为n的序列包含1-n的每一个数     输出序列c满足条件的一种序列。

    题解:序列a,b只存在两种可能  1有一个数不同    2有两个数不同

    首先输入a,b数组,比较a b数组在每个位置上的数是否相同,相同则放入数组d,并用vis数组做标记此数已经访问

                               不相同则将该位置记录在向量q中

    向量q则记录量数组在哪一个(两个)位置上不同

    若有2个数不同,访问vis数组,如果vis[i]=0说明i在c数组中没有出现,将i放入向量中

    此时向量q前两个数是数组a,b不相同的位置(数组c没有值得位置),后两个数是数组c中没有出现的数

    有2中可能0和2,1和3      0和3,1和2根据已知条件判断为哪种情况

    #include<iostream> 
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    using namespace std;
    int a[1005],b[1005],c[1005],n;
    int vis[1005];
    
    int main()
    {
        int n;
        while(cin>>n)
        {
            vector<int>q;
            memset(vis,0,sizeof(vis));
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
            }
            int ans=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&b[i]);
                if(a[i]==b[i])
                {
                    vis[a[i]]=1;//将两数组相同时的数做标记 
                    c[i]=b[i];//并赋值给c数组 
                }
                else
                {
                    q.push_back(i);//将不相同的位置记录下来 
                    ans++;//记录有几个数不同 
                }
            }
            if(ans==1)//只有一个数不同 
            {
                for(int i=1;i<=n;i++)
                {
                    if(!vis[i])//i不存在 
                        c[q[0]]=i; //第q[0]个位置的数为i 
                }
            }
            else
            {
                int res1=0,res2=0;
                for(int i=1;i<=n;i++)
                { 
                    if(!vis[i])//查看那两个数在c数组中没有出现 
                    {
                        q.push_back(i);    
                    }    
                }    
                c[q[0]]=q[2],c[q[1]]=q[3];
                for(int i=1;i<=n;i++)//判断0和2 1和3这种情况是否成立 
                {
                    if(a[i]!=c[i])
                        res1++;
                    if(b[i]!=c[i])
                        res2++;
                }
                if(res1==res2&&res1==1);//成立 
                else                    //重新赋值 
                    c[q[0]]=q[3],c[q[1]]=q[2];
            }
            for(int i=1;i<=n;i++)
                printf("%d ",c[i]);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    关于托管存储过程的部署, 调试和性能
    Fast Fourier Transform in C# (CookyTurkey)
    The Story of Lena(.tiff)
    反射之反思(转)
    分享Oracle9i中建立自增字段的最新办法
    C#操作注册表
    Oracle服务器的常用命令行详细讲解
    为汶川受灾群众祈福!!!!!
    新的开始,新的起点
    完全删除Oracle数据库的方法
  • 原文地址:https://www.cnblogs.com/renwjing/p/7464322.html
Copyright © 2011-2022 走看看