USACO-Section2.1 Sorting a Three-Valued Sequence(排序)

2017-8-7

题目描述

给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数

解答

将结果与所给情况进行比较,相等不用处理,对应相反直接交换即可,否则进行处理

代码

/*
ID: 18795871
PROG: sort3
LANG: C++
*/
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
const int N = 1000;

ifstream fin("sort3.in");
ofstream fout("sort3.out");

int x[N+1],y[N+1];
bool f[N+1];
int cnt=0,n,x1,x2,x3;

void init(){
    int i;
    for (i=1;i<=x1;i++) y[i]=1;
    for (i=x1+1;i<=x1+x2;i++) y[i]=2;
    for (i=x1+x2+1;i<=x1+x2+x3;i++) y[i]=3;
}

void cal(){
    int i,j;
    int ss=0;
    for (i=1;i<=n;i++){
        if (x[i]==y[i]) f[i]=true;
    }
    for (i=1;i<=n;i++){
     if (!f[i]){
       for (j=i+1;j<=n;j++){
         if (!f[j]&&x[i]==y[j]&&x[j]==y[i]){ //对应相反直接交换 
                    cnt++;
                    f[i]=true;
                    f[j]=true;
                    break;
                }
            }
        }
    }
    int s=0;
    for (i=1;i<=n;i++){
        if (!f[i]) s++;
    }
    if (s!=0) fout<<s/3*2+cnt<<endl;
    else fout<<cnt<<endl;
}

int main()
{
    fin>>n;
    x1=0,x2=0,x3=0;
    for (int i=1;i<=n;i++){
        fin>>x[i];
        if (x[i]==1) x1++;
        else if (x[i]==2) x2++;
        else x3++;
    }
    init();
    cal();
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值