2 条题解
-
-1
武子涵@石湖中学 (武子涵) LV 10 @ 4 年前
#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;
} -
-16 年前@
- 1
信息
- 难度
- 7
- 分类
- (无)
- 标签
- 递交数
- 772
- 已通过
- 126
- 通过率
- 16%
- 被复制
- 5
- 上传者