题目描述
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数
输入输出格式
输入格式:
第一行:
奖牌个数N (1 <= N <= 1000)
第 2行到第N+1行:
每行一个数字,表示奖牌。共N行。(1..3)
输出格式:
共一行,一个数字。表示排成升序所需的最少交换次数。
输入输出样例
说明
USACO 2.1
翻译来自NOCOW
刚开始随便写了写,,
受到之前某题的影响,,
写了一个,,很,,,什么什么的代码,,
就是乱搞,数据太水,还拿了87,
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 8 int n,ans; 9 int a[1002],b[1002]; 10 11 int main() 12 { 13 scanf("%d",&n); 14 for(int i=1;i<=n;++i) 15 { 16 scanf("%d",&a[i]); 17 b[i]=a[i]; 18 } 19 sort(b+1,b+n+1); 20 for(int i=1;i<=n;++i) 21 if(b[i]!=a[i]) 22 ans++; 23 if(ans%2==1) 24 printf("%d",ans/2+1); 25 else printf("%d",ans/2); 26 return 0; 27 }
这就是个贪心题啊,,
题解里的代码都好长啊。。。。
二维的,,三维的,,
一维的不行吗。。
然后就去看了某学姐博客,,
哇,短,我喜欢。
哇!这思路,贼牛逼。
哇!amazing!
这么神奇,
我怎么可能会想到这种方法。。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 8 int n; 9 int a[1002],b[4],c[4]; 10 11 int main() 12 { 13 scanf("%d",&n); 14 for(int i=1;i<=n;++i) 15 { 16 scanf("%d",&a[i]); 17 b[a[i]]++; 18 } 19 for(int i=1;i<=b[1]+b[2];++i) 20 { 21 if(a[i]==3) c[3]++; 22 else if(a[i]==2&&i<=b[1]) c[1]++; 23 else if(a[i]==1&&i>b[1]) c[2]++; 24 } 25 int x=max(c[1],c[2]); 26 printf("%d",c[3]+x); 27 return 0; 28 }
如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,那么深情的望着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。