中级天翼
2639 三值排序
经验值:1600 时间限制:1000毫秒
题目描述 Description
现在有一个由N个整数组成的序列,每个整数都是整数1,2,3中的某一个,所以序列中只有这三种整数。
现在给你这样的一个序列,请问最少要交换多少个数的位置,才能将它们排成升序。
输入描述 Input Description
第一行,一个整数,N
接下来N行,每行一个整数
输出描述 Output Description
最少需要交换的次数
样例输入 Sample Input
9 2 2 1 3 3 3 2 3 1
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
N≤1000
武建豪在2021-09-13 20:59:58追加了内容
哪错了
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<iomanip>
#include<cstdlib>
#include<vector>
using namespace std;
int n,x,y,z;
int n12,n13,n21,n23,n31,n32;
int num[10005];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>num[i];
if(num[i]==3)x++;
else if(num[i]==2)y++;
else z++;
}
for(int i=3;i<=x;i++)
if(num[i]==2) n12++;
else if(num[i]==1) n13++;
for(int i=x+1;i<=x+y;i++)
if(num[i]==3) n21++;
else if(num[i]==1) n23++;
for(int i=x+y+1;i<=x+y+z;i++)
if(num[i]==3) n31++;
else if(num[i]==2) n32++;
int ans=0;
ans+=min(n12,n21)+min(n13,n31)+min(n23,n32);
ans+=(n12+n13+n21+n23+n31+n32-ans*2)/3*2;
cout<<ans;
return 0;
}
/*2639 三值排序经验值:1600 时间限制:1000毫秒
题目描述 Description
现在有一个由N个整数组成的序列,每个整数都是整数1,2,3中的某一个,所以序列中只有这三种整数。
现在给你这样的一个序列,请问最少要交换多少个数的位置,才能将它们排成升序。
输入描述 Input Description
第一行,一个整数,N
接下来N行,每行一个整数
输出描述 Output Description
最少需要交换的次数
样例输入 Sample Input
9
2
2
1
3
3
3
2
3
1
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
N≤1000*/
武建豪在2021-09-13 21:21:29追加了内容
ding
武建豪在2021-09-16 20:37:28追加了内容
ding
中级光能
核心:
int a[1001]={0};
int i,n=0;
int x=0,y=0,z=0;
scanf("%d", &n);
for(i=0;i<n;i++)
{
scanf("%d", &a[i]);
switch(a[i])
{
case 1:x++;break;
case 2:y++;break;
case 3:z++;break;
}
}
int j=0;
int xx=0,yy=0,zz=0;
for(i=0;i<n;i++)
{
if(i<x)
{
if(a[i]!=1)
xx++;
}
if(i>=x&&i<y+x)
{
if(a[i]==3)
yy++;
}
if(i>=y+x&&i<z+y+x)
{
if(a[i]==2)
zz++;
}
}
if (yy>zz) xx+=yy;
else xx+=zz;
printf("%d\n",xx);
return 0;