描述
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
[编辑]格式
PROGRAM NAME: sort3
INPUT FORMAT:
(file sort3.in)
第一行:
奖牌个数N (1 <= N <= 1000)
第 2行到第N+1行:
每行一个数字,表示奖牌。共N行。(1..3)
银行存款利息计算
OUTPUT FORMAT:
(file sort3.out)
共一行,一个数字。表示排成升序所需的最少交换次数。
豪杰是什么意思[编辑]SAMPLE INPUT
9
2
2
1
3
3
3怎么治疗甲亢
2
3
1
[编辑]SAMPLE OUTPUT
4
分析
题意求排序所需的最少移动次数,可以先将输入的数字排序,然后得到不同的地方
比如:
2 2 1 3 3 3 2 3 1
1 1 2 2 2 3 3 3 3
用一个组合(a,b)表示应该排序后某个位置应该是a,但之前的是b
则我们得到(1,2), (1,2), (2,1), (2,3), (2,3), (3,2), (3,1)
然后求这些组合能组成的环,结果就是所有环的长度和减去环的个数
(1,2), (2,1) ---长度为2
(1,2), (2,3), (3,1) ---长度为3
(2,3), (3,2) ---长度为2
结果2+3+2-3=4
这个不怕题目改为1234排序。。。下面的就怕:
另一个简单的思路
我是没看懂前面的...所以自己想了一个 首先 如果两数位置都错了,并且交换后都在正确的位置,这一次交换肯定是必然的 跑一遍 把所有的符合上述条件的数交换回来 每次交换ANS++;
剩下的就是3个数的位置都是错的,也可以通过两次交换达到正确位置 每次交换ans+=2; (其实可以不用交换,就检查一下在1的位置上有多少个不是1的,乘2即可):
炸汤圆
#include<fstream>
using namespace std;
ifstream fin("sort3.in");
ofstream cout("sort3.out");
int n,a[1001],b[1001],num[4][4]={0},ans=0;
mac字体安装
int main()
{
int i,j;
fin>>n;
for(i=1;i<=n;i++)
{
fin>>a[i];
b[i]=a[i];
}
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(b[i]>b[j]) swap(b[i],b[j]);
for(i=1;i<=n;i++)
num[b[i]][a[i]]++;
j=min(num[1][2],num[2][1]);
num[1][2]-=j;
num[2][1]-=j;
ans+=j;
j=min(num[1][3],num[3][1]);
num[1][3]-=j;
num[3][1]-=j;上海动物园
ans+=j;
j=min(num[3][2],num[2][3]);
num[3][2]-=j;
num[2][3]-=j;
ans+=j;
北汉山
ans+=max(num[1][2],num[2][1])*2;
cout<<ans<<endl;
// system("pau");
return 0;
超虐的小说
}