2 条题解
-
-1武子涵@石湖中学 (武子涵) LV 10 @ 2021-03-13 13:54:57
#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;
} -
-12018-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
- 分类
- (无)
- 标签
- 递交数
- 768
- 已通过
- 125
- 通过率
- 16%
- 被复制
- 5
- 上传者