codeforces——B. An express train to reveries(全排列)

来源:互联网 发布:淘宝2017年大股东是谁 编辑:程序博客网 时间:2024/06/10 19:56

题意:
给出两个数组a,b,找出另一个数组p,满足:
(1)a中元素与p只有一个不一样,b中元素与p只有一个不一样
(2)p中元素从1到n都有。
分析:
首先,找出a和b位置相同但是数值不同的位置,并且记录下来,再找出还需要放置的元素,然后全排列,一次试试,看是否满足条件。我这个菜鸡,其实当时没做出来(哎,只做出一个的菜鸡,日常掉分,难受),因为输出格式错了,总是得不出答案,就心态崩了,以后一定要耐心。
题目链接:
(http://codeforces.com/contest/814/problem/B)
代码如下:

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<vector>using namespace std;vector<int>pos;vector<int>cor;vector<int >shengyu;int main(){    //输入部分    int n;    cin>>n;    int a[1005],b[1005];    for(int i=0;i<n;i++)        cin>>a[i];    for(int i=0;i<n;i++)        cin>>b[i];    for(int i=0;i<n;i++)        if(a[i]==b[i])      //如果同位置数字相同,则记录到cor中        cor.push_back(a[i]);    else                    //如果不同,把位置记录到pos中        pos.push_back(i);       //找出剩余的没有确定位置的数字    for(int i=1;i<=n;i++)    {        int flag=0;        for(int j=0;j<cor.size();j++)    {        if(cor[j]==i)            flag=1;    }    if(!flag)                        shengyu.push_back(i);    }   //全排列,用不同顺序的剩余数字测试     do     {         int num1=0,num2=0;            for(int i=0;i<shengyu.size();i++)            {                if(a[pos[i]]!=shengyu[i])   //检测a数组中被标记位置               num1++;               if(b[pos[i]]!=shengyu[i])//检测b数组中被标记位置                num2++;            }            if(num1==1&&num2==1)        //如果不同的都只出现一次,则正确,输出                  {                    for(int i=0,j=0;i<n;i++)                        if(i==pos[j])       //处理被标记位置的输出                           {                                cout<<shengyu[j]<<" ";                                j++;                           }                        else                        {                            cout<<a[i]<<" ";                            continue;                        }                       return 0;                        }                }     while(next_permutation(shengyu.begin(),shengyu.end()));}
原创粉丝点击