三值排序

来源:互联网 发布:乐思网络信息采集系统 编辑:程序博客网 时间:2024/05/14 21:53

这道题我是真懵了,什么贪心,我可一点没看出来。

原文地址:http://www.jianshu.com/p/4297e46d8a12

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

写一个程序计算出,计算出的一个包括1、2、3三种值的数字序列,排成升序所需的最少交换次数。

输入第1行为类别的数量N(1≤N≤1000)

输入第2行到第N+1行,每行包括一个数字(1或2或3)。

输出包含一行,为排成升序所需的最少交换次数。

样例输入

9221333231

样例输出

4
Scanner scan=new Scanner(System.in);int count=0;//记录总数int num=scan.nextInt();int array[]=new int[num];int a=0,b=0,c=0;for(int i=0;i<num;i++){array[i]=scan.nextInt();if(array[i]==1)a++;else if(array[i]==2)b++;else c++;}for(int i=0;i<a;i++){if(array[i]!=1)count++;}int b1=0,c1=0;for(int i=a;i<a+b;i++){if(array[i]!=2&&array[i]!=1)b1++;}for(int i=a+b;i<a+b+c;i++){if(array[i]!=3&&array[i]!=1)c1++;}System.out.println(count+Math.max(b1, c1));

 164ms19744kBjava
#include<iostream>using namespace std;int main() {int arr[1000];int num;int a = 0, b = 0, c = 0;cin >> num;for (int i = 0; i < num; i++){cin >> arr[i];if (arr[i] == 1)a++;else if (arr[i] == 2)b++;elsec++;}int count = 0;int c1 = 0, b1 = 0;for (int i = 0; i < num;i++) {if (i < a&&arr[i] != 1)count++;else if (i>=a&&i < a+b && arr[i] == 3)b1++;else if (i>=(a+b)&&i < a+b+c&&arr[i] != 1 && arr[i] == 2)c1++;}int max = b1 > c1 ? b1 : c1;cout << (count + max);}


原创粉丝点击