USACO 2.1-Sorting a Three-Valued Sequence

本文探讨了一个关于给定由1,2,3组成的数字序列,如何通过最少的交换操作使其升序排列的问题。通过分析序列中元素的位置关系,文章提出了两种主要策略来计算所需交换次数。首先,对于位置不匹配的元素,它们可能形成闭合环,通过计算这些环的长度总和减去环的数量得到答案。其次,对于三元素全错位的情况,可以通过两次交换达到正确位置。此外,对于序列中位于1的位置上但不是1的元素,可通过简单乘以2来估算额外的交换次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://train.usaco.org/usacoprob2?a=bzdILz0bsTb&S=sort3

/*
ID: m1590291
TASK: sort3
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
/****************************************************************************************************************
                题意:给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
                思路:
                一,前后位置不相同的组成N个环,所有环的长度和减去环的个数就是所得解
                二,图没有那么熟悉,就用了第二种,也是超NB的一种思路
                   1,如果两数位置都错了,并且交换后都在正确的位置,这一次交换肯定是必然的
                      跑一遍 把所有的符合上述条件的数交换回来 每次交换 num++;
                   2,剩下的就是3个数的位置都是错的,也可以通过两次交换达到正确位置 每次交换  num+=2;
                      其实可以不用交换,就检查一下在1的位置上有多少个不是1的,乘2即可
****************************************************************************************************************/
int a[1005],b[1005];
int main()
{
    ifstream fin("sort3.in");
    ofstream fout("sort3.out");

    int N;
    while(fin>>N)
    {
        for(int i = 0;i < N;i ++){
            fin>>a[i];
            b[i]=a[i];
        }
        sort(a,a+N);
        int num=0;
        int t;
        for(int i = 0;i < N;i ++){
            for(int j = 0;j < N;j ++){
                if(i == j)  continue;
                if(b[i] != b[j] && b[i] == a[j] && b[j] == a[i]){
                    //fout<<"i= "<<i<<" j= "<<j<<endl;
                    //fout<<"b[i]= "<<b[i]<<" b[j]= "<<b[j]<<endl;
                    t=b[j];
                    b[j]=b[i];
                    b[i]=t;
                    num++;
                    break;
                }
            }
        }
        //fout<<num<<endl;
        for(int i = 0;i < N;i ++)
            if(a[i] == 1 && b[i] != 1)
                num+=2;
        fout<<num<<endl;
    }
    return 0;
}



 

转载于:https://www.cnblogs.com/Jstyle-continue/p/6351999.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值