UPC 2959: Caoshen like math 这就是个水题

http://acm.upc.edu.cn/problem.php?id=2959

这就是个水题,之所以要写这个题是感觉很有纪念意义

用力看就是盲……
23333333333333333

这个题就是最小交换几次使数组有序,首先想到的竟然是逆序数

但是逆序数是冒泡排序用的,怎么可能最小……!!!!

具体题解是:

先用结构体标记每个元素的位置和内容,然后进行排序

跟原来的数组进行比较,位置不符合,将原数组 元素 跟 本该排好序在这个位置的元素交换

然后 二分查找 结构体数组里面 该 元素 将 坐标更新

就是这样,很无聊……

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <algorithm>

#include <cstdlib>

#include <map>

#include <stack>

#include <queue>

#include <vector>

 

const int MAXN = 1000000 + 10;

const double ESP = 10e-8;

const double Pi = atan(1.0) * 4;

const int INF = 0x7fffffff;

const int MOD = 2012;

typedef long long LL;

 

LL gcd(LL a,LL b){

    return b ?gcd(b,a%b): a;

}

using namespace std;

struct P{

    int x;

    int pp;

    bool operator < (const P a)const{

        return x < a.x;

    }

};

int a[MAXN];

P b[MAXN];

int main(){

//    freopen("input.txt","r",stdin);

    int n;

    while(~scanf("%d",&n)){

        for(int i = 0;i < n;i++){

            scanf("%d",&a[i]);

            b[i].x = a[i];

            b[i].pp = i;

        }

        sort(b,b+n);

        int ans = 0;

        for(int i = 0;i < n;i++){

            if(a[i] != b[i].x){

                int pp = b[i].pp;

                int tmp = a[i];

                a[i] = b[i].x;

                a[pp] = tmp;

                P xx;

                xx.x = tmp;

                int x = lower_bound(b,b+n,xx) - b;

                b[x].pp = pp;

                ans++;

            }

        }

        printf("%d\n",ans);

    }

    return 0;

}

 

你可能感兴趣的:(Math)