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

xiaoxiao2021-02-28  66

题意: 给出两个数组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())); }
转载请注明原文地址: https://www.6miu.com/read-68051.html

最新回复(0)