• P1327 数列排序


    题目描述

    给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换?

    输入输出格式

    输入格式:

    第一行,正整数n (n<=100,000)。

    以下若干行,一共n个数,用空格分隔开,表示数列{an},任意-2^31<ai<2^31-1。

    输出格式:

    只有一行,包含一个数,表示最少的交换次数。

    输入输出样例

    输入样例#1: 复制
    8
    8 23 4 16 77 -5 53 100
    
    输出样例#1: 复制
    5
    

    直接o(n)扫过去;

    遇到不对的就直接交换就好了;

    #include<bits/stdc++.h>
    using namespace std;
    int a[100005],b[100005];
    map<int,int>F; //map函数是一个映射类型,用来记录
    int main()
    {
    int n,tot=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
    scanf("%d",&a[i]);
    b[i]=a[i];
    F[a[i]]=i;//建立映射
    }
    sort(b+1,b+n+1);
    for(int i=1;i<=n;i++)
    if(a[i]!=b[i]){
    tot++;
    int x=F[b[i]];
    F[a[i]]=x; //交换映射值
    a[x]=a[i];//交换值
    }
    printf("%d",tot);
    return 0;
    }

    Try and fail,but don't fail to try; 失败是成功之母
  • 相关阅读:
    大数据技术
    大数据技术
    大数据技术
    设计模式之代理模式
    大数据技术
    大数据技术
    大数据技术
    Intellij IDEA 解决 Maven 依赖下载慢的问题
    大数据技术
    QUdpSocket Class
  • 原文地址:https://www.cnblogs.com/Youio-bolg/p/11231852.html
Copyright © 2020-2023  润新知