这道题我是真懵了,什么贪心,我可一点没看出来。
原文地址:http://www.jianshu.com/p/4297e46d8a12
排序是一种很频繁的计算任务。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,计算出的一个包括1、2、3三种值的数字序列,排成升序所需的最少交换次数。
输入第1行为类别的数量N(1≤N≤1000)
输入第2行到第N+1行,每行包括一个数字(1或2或3)。
输出包含一行,为排成升序所需的最少交换次数。
样例输入
9 2 2 1 3 3 3 2 3 1
样例输出
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));
164ms | 19744kB | java |
#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++;
else
c++;
}
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);
}