2 条题解

  • -1

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    #define N 10000
    struct Arc {
    int si,ei;
    };

    void CountSort(int a[], int n, int order[]);
    int GetArcs(int a[], int n, Arc arcs[]);
    int GetCycle(Arc arcs[], int n);

    int main() {
    // freopen( "H:\命题\0 网站\4\Test\Input\input0.txt","r",stdin);
    // freopen("H:\命题\0 网站\4\Test\Output\output0.txt","w",stdout);
    int a[N],n,i;
    cin>>n;
    for(i=0; i<n; i++) cin>>a[i];
    Arc arcs[N];
    int k=GetArcs(a, n, arcs);
    int count=GetCycle(arcs,k);
    cout<< n-count<<endl; // 最少的交换次数
    return 1;
    }

    int GetArcs(int a[], int n, Arc arcs[]) {
    int order[N]; // order[]是有序的目标数组
    CountSort(a, n, order);
    int k=0;
    for(int i=0; i<n; i++) {
    arcs[k].si=i;
    arcs[k].ei=order[i];
    k++;
    }
    return k;
    }

    void CountSort(int a[], int n, int order[]) {
    for(int i=0; i<n; i++) {
    order[i]=0;
    for(int j=0; j<n; j++)
    if(a[j]<a[i])
    order[i]++;
    }
    }

    int GetCycle(Arc arcs[], int n) {
    int visited[N]= {0}; // 顶点访问标记数组
    int k=0; // 有向环(子图)的个数
    for(int i=0; i<n; i++) {
    if(visited[i]==1) continue;
    int v=arcs[i].si;; // 从起点v,遍历一个有向环
    while(visited[v]==0) {
    visited[v]=1;
    v=arcs[v].ei;
    }
    k++; // 有向环的个数增一
    }
    return k;
    }

  • -1
    @ 2018-12-07 16:41:00
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    #define N 10000
    struct Arc {
        int si,ei;
    };
    
    void CountSort(int a[], int n, int order[]);
    int GetArcs(int a[], int n, Arc arcs[]);
    int GetCycle(Arc arcs[], int n);
    
    int main() {
    //  freopen(  "H:\\命题\\0 网站\\4\\Test\\Input\\input0.txt","r",stdin);
    //  freopen("H:\\命题\\0 网站\\4\\Test\\Output\\output0.txt","w",stdout);
        int a[N],n,i;
        cin>>n;
        for(i=0; i<n; i++) cin>>a[i];
        Arc arcs[N];
        int k=GetArcs(a, n, arcs);
        int count=GetCycle(arcs,k);
        cout<< n-count<<endl;  // 最少的交换次数
        return 1;
    }
    
    int GetArcs(int a[], int n, Arc arcs[]) {
        int order[N]; // order[]是有序的目标数组
        CountSort(a, n, order);
        int k=0;
        for(int i=0; i<n; i++) {
            arcs[k].si=i;
            arcs[k].ei=order[i];
            k++;
        }
        return k;
    }
    
    void CountSort(int a[], int n, int order[]) {
        for(int i=0; i<n; i++) {
            order[i]=0;
            for(int j=0; j<n; j++)
                if(a[j]<a[i])
                    order[i]++;
        }
    }
    
    int GetCycle(Arc arcs[], int n) {
        int visited[N]= {0}; // 顶点访问标记数组
        int k=0;              // 有向环(子图)的个数
        for(int i=0; i<n; i++) {
            if(visited[i]==1) continue;
            int v=arcs[i].si;; // 从起点v,遍历一个有向环
            while(visited[v]==0) {
                visited[v]=1;
                v=arcs[v].ei;
            }
            k++;   // 有向环的个数增一
        }
        return k;
    }
    
  • 1

信息

难度
7
分类
(无)
标签
递交数
706
已通过
109
通过率
15%
被复制
5
上传者