先证明把每次i放到i位置最后次数最少:感觉,可以,用归纳法?

//在序列后再加一个相同的序列,就可以模拟用各个数字开头的情况了
每个位置不对的只需要换一次
54123 ,5固定->41235变成12345

任何一个数固定不变,都相当于从这种情况对应的1所在的位置开始排一遍12345.(例如54123 ,5固定->41235变成12345)所以只需要每个位置开始都判断变成12345所需步数即可

把输入倒过来看,变成12345就相当于正着变成54321 (这个对称很巧妙啊),可以模块化

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. int cal(int A[], int N) { //54123—>12345可以看做12354->12345所以每个位置开始都判断变成12345所需步数即可
  6. int cnt = , vis[] = {};
  7. for (int i = ; i <= N; i++) //cnt统计不用换位的个数;不用换位的A[j]就等于j,进入下一个数了
  8. if(!vis[i]) { //某个数还没到正确位置
  9. cnt++;
  10. for (int j = i; !vis[j]; j = A[j]) //这个循环中一直换位直到不用换
  11. vis[j] = ;
  12. }
  13. return N - cnt;
  14. }
  15.  
  16. int main() {
  17. int N, A[], B[];
  18. while (scanf("%d", &N), N) {
  19. for (int i = ; i <= N; i++) {
  20. scanf("%d", &A[i]);
  21. B[N - i + ] = B[ * N - i + ] = A[i + N] = A[i];
  22. }
  23.  
  24. int ans = << ;
  25. for (int i = ; i < N; i++)
  26. ans = min(ans, cal(A + i, N));
  27.  
  28. for (int i = ; i < N; i++)
  29. ans = min(ans, cal(B + i, N));
  30.  
  31. printf("%d\n", ans);
  32. }
  33.  
  34. return ;
  35. }
  36.  
  37. #include<cstdio>
  38. #include<cstring>
  39. #include<algorithm>
  40. using namespace std;
  41.  
  42. const int N = ;
  43. int p[N],k[N],w[N];
  44. int f[N],n;
  45.  
  46. int solve(int s, int d) {
  47. int cnt = ;
  48. for(int i = ; i <= n; i++) {
  49. if(k[i] != s) {
  50. cnt++;
  51. k[w[s]] = k[i];
  52. w[k[i]] = w[s];
  53. k[i] = s;
  54. w[s] = i;
  55. }
  56. s += d;
  57. if(s > n)
  58. s = ;
  59. if(s <= )
  60. s = n;
  61. }
  62. return cnt;
  63. }
  64. int main() {
  65. while(scanf("%d",&n) && n) {
  66. for(int i = ; i <= n; i++) {
  67. scanf("%d",&p[i]);
  68. f[p[i]] = i;
  69. }
  70. int Min = 0x3f3f3f3f;
  71. for(int i = ; i <= n; i++) {
  72. memcpy(k, p, sizeof(p));
  73. memcpy(w, f, sizeof(f));
  74. Min = min(Min, solve(i,-));
  75. memcpy(k, p, sizeof(p));
  76. memcpy(w, f, sizeof(f));
  77. Min = min(Min, solve(i,));
  78. }
  79. printf("%d\n",Min);
  80. }
  81. }

uva10570 Meeting with Aliens的更多相关文章

  1. UVA-10570 Meeting with Aliens (枚举+贪心)

    题目大意:将一个1~n的环形排列变成升序的,最少需要几次操作?每次操作可以交换任意两个数字. 题目分析:枚举出1的位置.贪心策略:每次操作都保证至少一个数字交换到正确位置上. # include< ...

  2. UVA 10570 Meeting with Aliens

    题意: N个外星人围成一桌坐下,有序的排列指N在N-1与N+1中间,现在给出一个序列,问至少交换几次可以得到有序的序列. 分析: 复制一遍输入序列,放在原序列之后.相当于环.通过枚举,可以把最小交换次 ...

  3. UVa 10570 Meeting with Aliens (暴力)

    题意:给定一个排列,每次可交换两个数,用最少的次数把它变成一个1~n的环状排列. 析:暴力题.很容易想到,把所有的情况都算一下,然后再选出次数最少的那一个,也就是说,我们把所有的可能的形成环状排列全算 ...

  4. UVA - 10570 Meeting with Aliens (置换的循环节)

    给出一个长度不超过500的环状排列,每次操作可以交换任意两个数,求把这个排列变成有序的环状排列所需的最小操作次数. 首先把环状排列的起点固定使其成为链状排列a,枚举排好序时的状态b(一种有2n种可能) ...

  5. UVA 10570 Meeting with Aliens 外星人聚会

    题意:给你一个排列,每次可以交换两个整数(不一定要相邻),求最少交换次数把排列变成一个1~n的环形排列.(正反都算) 其实就是找环了,对于一个链状序列,最小交换次数等于不在对应位置的数字个数减去环的个 ...

  6. 【习题 8-13 UVA - 10570】Meeting with Aliens

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举1的位置在i 往右摆成一排. a[i+1]..a[n]..a[1]..a[i-1]变为有序的 ->寻找循环节,每个循环节的 ...

  7. UVA - 10570 Meeting with Aliens(外星人聚会)(暴力枚举)

    题意:输入1~n的一个排列(3<=n<=500),每次可以交换两个整数.用最少的交换次数把排列变成1~n的一个环状序列. 分析:正序反序皆可.枚举每一个起点,求最少交换次数,取最小值. 求 ...

  8. 【uva 10570】Meeting with Aliens(算法效率--暴力+贪心)

    题意:输入1~N的一个排列,每次可以交换2个整数,问使排列变成1~N的一个环状排列所需的虽少交换次数.(3≤N≤500) 解法:(又是一道我没打代码,光想和看就花了很久时间的题~QwQ)由于n很小,可 ...

  9. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

随机推荐

  1. bzoj2337 XOR和路径——高斯消元

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2337 异或就一位一位考虑: x为到n的概率,解方程组即可: 考虑了n就各种蜜汁错误,所以索性 ...

  2. 输出文章段落首行空格缩进在IE和chrome显示不一致的问题

    一般的编辑文章时,首行都缩进两格,而执行的操作则是一个tab键或者四个空格键,在html代码中体现的往往都是4个 然而我在输出时却发现了同样的html代码,在IE上显示的是缩进了一个字符,在chrom ...

  3. VMware ESXI虚拟机挂载移动硬盘

    Windows server2008 R2 1.“编辑虚拟机设置”,点击“添加” 2.点击添加“USB控制器”: 3.添加完“USB控制器”以后,再点击添加“USB设备”: 完成即可:如果系统里面不显 ...

  4. C++笔试题(七)

    微软研究院是一个听起来就牛B的地方啊,反正我是进不去,不过不妨碍我看看他的笔试题到底是怎么样的.下面四道题就是微软研究院的笔试题目,题后附有我的解答.微软研究院(亚洲)的网址是:http://rese ...

  5. 关于Page翻页效果, PageViewConrtoller

    Page View Controllers你使用一个page view controller用page by page的方式来展示内容.一个page view controller管理一个self-c ...

  6. Nginx系列篇四:Nginx+keepalived搭建一个高可用的双机双主热备

    建议:先阅读Nginx+keepalived主从配置,因为此篇是接着上篇开始的 上一篇我们简单的介绍了主从配置及其缺点,我们看一下双主热备配置: 2台Nginx+keepalived互为主备,各自绑定 ...

  7. JavaSE基础知识结构

  8. Java反编译工具-JD-GUI

    Java是跨平台的,JD-GUI提供了多个系统的支持,但是不建议直接安装,最快的方式推荐直接下载JAR包,然后用java -jar进行运行. 就现在的版本是1.4.0,停留在2015年,估计近期会更新 ...

  9. c++,类的对象作为形参时一定会调用复制构造函数吗?

    c++,类的对象作为形参时一定会调用复制构造函数吗? 答:如果参数是引用传递,则不会调用任何构造函数:如果是按值传递,则调用复制构造函数,按参数的值构造一个临时对象,这个临时对象仅仅在函数执行是存在, ...

  10. Eclipse安装jad反编译插件(在线安装)

    Help→Eclipse Marketplace→Find→jad 然后等安装完成重启eclipse即可