题目描述 :
有N(1≤N≤1000)头奶牛,它们都被标上一个优先等级编号:1,2或3。用来表示它们喝水时的优先次序,编号为l的最优先,编号为2的其次,编号为3的最后。每天奶牛开始时排成一行,但总是很乱,需要你把它们重新排成编号为1的奶牛在最前面,编号为2的其次,编号为3的奶牛在最后。你能计算出最少需要多少的交换次序来完成这次重排吗?
输入描述:
第1行:1个整数N;
第2至N+I行:第i+l行有一个整数表示开始队列中第i头奶牛的编号。
输出描述:
1行,只一个整数,表示最少需要交换次数。
测试案例:
输入
9
2 2 1 3 3 3 2 3 1
输出
4
解题思路:
1.因为奶牛编号,用一维动态数组存放;
2.读入数据时,同时记录编号为1,2和3的奶牛个数,分别为num1,num2和num3
3.只需要统计交换次数,实际不进行编号交换
#include <iostream>
using namespace std;
int main()
{
int N; //奶牛个数
while (cin>>N)
{
int *a = new int [N]; //动态一维数组 存放奶牛编号
int i, num1=0, num2=0, num3=0;
for (i = 0; i < N; ++i)
{
cin >> a[i];
if (a[i] == 1)
num1++; //编号为1 的奶牛个数
else if (a[i] == 2)
num2++; //编号为2 的奶牛个数
else
num3++; //编号为3 的奶牛个数
}
int res = 0; //交换次数
for (i = 0; i < num1; i++) //遍历0~(num1-1)
{
if (a[i] != 1) //编号不为1 则需要交换
res++;
}
for (i = num1; i < num1+num2; i++) //遍历num1~(num1+num2-1)
{
if (a[i] == 3)//编号为3则需要交换(因为编号2不用交换,编号1已统计过次数)
res++;
}
cout << res << endl; //输出交换次数
}
system("pause");
return 0;
}