博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
#418 Div2 Problem B An express train to reveries (构造 || 全排列序列特性)
阅读量:4638 次
发布时间:2019-06-09

本文共 1644 字,大约阅读时间需要 5 分钟。

题目链接:http://codeforces.com/contest/814/problem/B

题意 : 有一个给出两个含有 n 个数的序列 a 和 b, 这两个序列和(1~n)的其中一个全排列序列 p 只有一个元素不同, 要求你找出任意满足这个条件的序列 p

 

分析 : 全排列有个特点, 就是各个元素各不相同, 只要改变了其中的一个元素(当然改变后还是在1~n内), 那序列当中必有重复的元素, 而且在1~n中必定有一个数不会出现在这个序列中。很显然的一个特点, 如果没有想到的话, 这题可能就比较难看出解法了。实际上a 和 b就是这样改变了一个元素后的序列, 所以只要找出 a 中的两个相同元素所在的位置, 分别轮流替换成未出现的元素和原来的元素, 然后去和b匹配一下是否满足题意, 如果满足则就是第一种组合, 否则就是第二种了。例如 1 2 2 3 , 那就可以变化成 1 2 4 3 和 1 4 2 3去匹配b。

 

瞎搞 : 想来想去想了挺久, 往错的方向想了很久, 最后情况分类实在太多, 自己也晕了, 打出来也就只通过了21个点, 还是弱啊........

 

#include
using namespace std;map
m;int n;int a[1001], b[1001], vis[1001], c[1001];bool Check(){ int diffb = 0; for(int i=1; i<=n; i++){ if(c[i]!=b[i]) diffb++; } if(diffb==1) return true; return false;}int main(void){ scanf("%d", &n); int fir, sec; memset(vis, false, sizeof(vis)); int index1, index2; for(int i=1; i<=n; i++){ scanf("%d", &a[i]); vis[a[i]] = true; if(m.count(a[i])){ index1 = m[a[i]]; index2 = i; fir = a[i]; } m[a[i]] = i; } for(int i=1; i<=n; i++){ scanf("%d", &b[i]); if(i!=index1 || i!=index2) c[i] = a[i]; } for(int i=1; i<=n; i++){ if(!vis[i] && i!=fir){ sec = i; break; } } c[index1] = fir, c[index2] = sec; if(Check()){ for(int i=1; i<=n; i++){ printf("%d ", c[i]); } puts(""); return 0; } c[index1] = sec, c[index2] = fir; for(int i=1; i<=n; i++){ printf("%d ", c[i]); } puts(""); return 0;}
View Code

 

转载于:https://www.cnblogs.com/LiHior/p/6994900.html

你可能感兴趣的文章
JasperReport报表设计4
查看>>
项目活动定义 概述
查看>>
团队冲刺04
查看>>
我的Python分析成长之路8
查看>>
泛型在三层中的应用
查看>>
SharePoint2010 -- 管理配置文件同步
查看>>
.Net MVC3中取得当前区域的名字(Area name)
查看>>
获得屏幕像素以及像素密度
查看>>
int与string转换
查看>>
adb命令 判断锁屏
查看>>
推荐一个MacOS苹果电脑系统解压缩软件
查看>>
1035等差数列末项计算
查看>>
CDMA鉴权
查看>>
ASP.NET MVC Identity 兩個多個連接字符串問題解決一例
查看>>
过滤器与拦截器区别
查看>>
USACO 1.5.4 Checker Challenge
查看>>
第二阶段站立会议7
查看>>
[18]Debian Linux Install GNU GCC Compiler and Development Environment
查看>>
JAVA多线程
查看>>
ACE(Adaptive Communication Environment)介绍
查看>>