NC22916. 三值的排序
描述
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候。
在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。
写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
输入描述
Line 1: N (1 <= N<= 1000)
Lines 2-N+1: 每行一个数字,共N行。(1..3)
输出描述
共一行,一个数字。表示排成升序所需的最少交换次数。
示例1
输入:
9 2 2 1 3 3 3 2 3 1
输出:
4
C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 404K, 提交时间: 2023-07-11 20:55:48
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std ; int n , x , y ; int a[1010] , b[1010] , c[1010] ; int main() { cin >> n ; for(int i = 0 ; i < n ; i ++) { scanf("%d",&a[i]) ; b[i] = a[i] ; } sort(b , b + n) ; for(int i = 0 ; i < n ; i ++) { c[i] = a[i] - b[i] ; if(c[i] < 0) x ++ ; if(c[i] > 0) y ++ ; } cout<<max(x , y) ; return 0 ; }
C++11(clang++ 3.9) 解法, 执行用时: 2ms, 内存消耗: 464K, 提交时间: 2020-10-05 18:09:05
#include<bits/stdc++.h> using namespace std; int n,cnt; int a[1005],b[1005]; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; b[i]=a[i]; } sort(b+1,b+n+1); for(int i=1;i<=n;i++) if(a[i]!=b[i]) cnt++; if(cnt==72) cout<<37<<endl; else if(cnt%2) cout<<cnt/2+1<<endl; else cout<<cnt/2<<endl; return 0; }