Description

排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候。 在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。 写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。

Input

Line 1: N (1 <= N <= 1000) Lines 2-N+1: 每行一个数字,共N行。(1..3)

Output

共一行,一个数字。表示排成升序所需的最少交换次数。

Sample Input

  1. 9
  2. 2
  3. 2
  4. 1
  5. 3
  6. 3
  7. 3
  8. 2
  9. 3
  10. 1

Sample Output

  1. 4
  2.  
  3. 这个题以前做过一次,现在在巩固一下。
  4.  
  5. 对于不在正确位置的数字,会有两种方式,一种是 1 3 2 ”(有一个数字在正确位置),这样只需要交换一次即可,另一种是“ 3 1 2 ”(三个数字都不在正确的位置),这样需要交换两次。
    如果全部的第一种方式已经修正完毕,那么剩下的就只有第二种方式了。
  6.  
  7. 将线段划分成三个区间,然后将这三个区间抽象成三个点,转化为“ 1 2 3 ”这三个数的排列方式。
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<string>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<stack>
  9. #include<deque>
  10. #include<map>
  11. #include<iostream>
  12. using namespace std;
  13. typedef long long LL;
  14. const double pi=acos(-1.0);
  15. const double e=exp();
  16. const int N = ;
  17.  
  18. struct num{
  19. int a;
  20. int b;
  21. int c;
  22. }num[];
  23. int con[];
  24. int main()
  25. {
  26. int i,p,j,n;
  27. int a,b,c,aa,bb,cc;
  28. a=b=c=aa=bb=cc=;
  29. memset(num,,sizeof(num));
  30. scanf("%d",&n);
  31. for(i=;i<=n;i++)
  32. {
  33. scanf("%d",&con[i]);
  34. if(con[i]==)
  35. aa++;
  36. else if(con[i]==)
  37. bb++;
  38. else
  39. cc++;
  40. }
  41. for(i=;i<=aa;i++)
  42. {
  43. if(con[i]==)
  44. num[].a++;
  45. if(con[i]==)
  46. num[].b++;
  47. if(con[i]==)
  48. num[].c++;
  49. }
  50. for(i=aa+;i<=aa+bb;i++)
  51. {
  52. if(con[i]==)
  53. num[].a++;
  54. if(con[i]==)
  55. num[].b++;
  56. if(con[i]==)
  57. num[].c++;
  58. }
  59. for(i=aa+bb+;i<=n;i++)
  60. {
  61. if(con[i]==)
  62. num[].a++;
  63. if(con[i]==)
  64. num[].b++;
  65. if(con[i]==)
  66. num[].c++;
  67. }
  68.  
  69. // for(i=1;i<=3;i++)
  70. // printf("%d %d %d\n",num[i].a,num[i].b,num[i].c);
  71.  
  72. int ans=,mid;
  73.  
  74. if(num[].b!=&&num[].a!=)
  75. {
  76. mid=min(num[].b,num[].a);
  77. ans+=mid;
  78. num[].b-=mid;
  79. num[].a-=mid;
  80. }
  81. if(num[].c!=&&num[].a!=)
  82. {
  83. mid=min(num[].c,num[].a);
  84. ans+=mid;
  85. num[].c-=mid;
  86. num[].a-=mid;
  87. }
  88. if(num[].c!=&&num[].b!=)
  89. {
  90. mid=min(num[].c,num[].b);
  91. ans+=mid;
  92. num[].c-=mid;
  93. num[].b-=mid;
  94. }
  95.  
  96. ans+=(num[].b+num[].c+num[].a+num[].c+num[].a+num[].b)/*;
  97.  
  98. printf("%d\n",ans);
  99. return ;
  100. }

洛谷 Sorting a Three-Valued Sequence 三值的排序的更多相关文章

  1. 洛谷P1459 三值的排序 Sorting a Three-Valued Sequence

    P1459 三值的排序 Sorting a Three-Valued Sequence 166通过 369提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 那么 ...

  2. 洛谷 P1459 三值的排序 Sorting a Three-Valued Sequence

    P1459 三值的排序 Sorting a Three-Valued Sequence 题目描述 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者 ...

  3. 【题解】洛谷P4281 [AHOI2008] 紧急集合(求三个点LCA)

    洛谷P4281:https://www.luogu.org/problemnew/show/P4281 思路 答案所在的点必定是三个人所在点之间路径上的一点 本蒟蒻一开始的想法是:先求出2个点之间的L ...

  4. Sorting a Three-Valued Sequence(三值的排序)

    Description 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候. 在这个任务中可能的值只有三种1,2和3.我们用交换的 ...

  5. 洛谷P4581 [BJOI2014]想法(玄学算法,拓扑排序)

    洛谷题目传送门 萝卜大毒瘤 题意可以简化成这样:给一个DAG,求每个点能够从多少个入度为\(0\)的点到达(记为\(k\)). 一个随机做法:给每个入度为\(0\)的点随机一个权值,在DAG上求出每个 ...

  6. 洛谷P1080 国王游戏 python解法 - 高精 贪心 排序

    洛谷的题目实在是裹脚布 还编的像童话 这题要 "使得获得奖赏最多的大臣,所获奖赏尽可能的少." 看了半天都觉得不像人话 总算理解后 简单说题目的意思就是 根据既定的运算规则 如何排 ...

  7. 动态规划 洛谷P4017 最大食物链计数——图上动态规划 拓扑排序

    洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环 ...

  8. P1459 三值的排序 Sorting a Three-Valued

    题目描述 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候.在这个任务中可能的值只有三种1,2和3.我们用交换的方法把他排成升 ...

  9. 【USACO 2.1.3】三值的排序

    [题目描述] 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候.在这个任务中可能的值只有三种1,2和3.我们用交换的方法把他排 ...

随机推荐

  1. 【第五周】alpha发布之小组评论

    对于昨天的阿尔法发布,有那么几点需要说一下: 1,对这次阿尔法发布的过程,我们组还是基本顺利的,由于之前吃过亏,这次我提前试用了一下投影仪,做了些调试,之后的发布过程起码设备上是正常的. 2,我们的项 ...

  2. Spring mvc 数据验证框架注解

    @AssertFalse 被注解的元素必须为false@AssertTrue 被注解的元素必须为false@DecimalMax(value) 被注解的元素必须为一个数字,其值必须小于等于指定的最小值 ...

  3. 【前端学习笔记】JavaScript 小案例合集

    获取一个0-9的随机数: Math.round(Math.random()*9); 去除数组中重复的元素: var arr=[1,3,5,4,3,3,1,4] function editArr(arr ...

  4. 第76天:jQuery中的宽高

    Window对象和document对象的区别 1.window对象表示浏览器中打开的窗口 2.window对象可以省略,比如alert()也可以写成window.alert() Document对象是 ...

  5. bzoj4032-最短不公共子串

    题意 给出两个长度小于等于2000的小写字母串,四个问题: A的最短子串不是B的子串 A的最短子串不是B的子序列 A的最短子序列不是B的子串 A的最短子序列不是B的子序列 分析 虽然求的是不公共,但是 ...

  6. Java虚拟机内存模型和volatile型变量

    Java虚拟机内存模型 了解Java虚拟机的内存模型,有助于我们明白为什么会发生线程安全问题. 上面这幅图是<深入理解Java虚拟机-JVM高级特性与最佳实践>的书中截图. 线程共享的变量 ...

  7. Contest 7

    A:搜索好难啊根本不会啊. B:原题都能写挂没救了啊.考虑求出每个数作为最小值时能向左向右扩展到的最远位置,那么这段区间里的所有数就不可能作为唯一的最小值成为最优解了,否则假设可以的话这段区间里的数都 ...

  8. [COGS1000]伊吹萃香 最短路

    1000. [東方S2] 伊吹萃香 输入文件:suika.in   输出文件:suika.out   简单对比 时间限制:1 s   内存限制:128 MB Problem 4 伊吹萃香(suika. ...

  9. 飞舞的蝴蝶(GraphicsView框架)

    飞舞的蝴蝶(GraphicsView框架) 一.简介 GraphicsView框架结构主要包含三个主要的类QGraphicsScene(容器).QGraphicsView(视图).QGraphicsI ...

  10. 【Cogs2187】帕秋莉的超级多项式(多项式运算)

    [Cogs2187]帕秋莉的超级多项式(多项式运算) 题面 Cogs 题解 多项式运算模板题 只提供代码了.. #include<iostream> #include<cstdio& ...