问题标题: 酷町堂:2639 三值排序

0
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 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


0
已采纳
被禁言 张皓轩
张皓轩
中级光能
中级光能
核心:
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;

 

0
丁博扬
丁博扬
中级天翼
中级天翼

我想问一下,你这发的不是打卡题吗

0
0
我要回答