hust1347(归并排序求逆序对)
生活随笔
收集整理的這篇文章主要介紹了
hust1347(归并排序求逆序对)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:
給出一個數(shù)列,你要對這個數(shù)列的數(shù)字進(jìn)行k次交換操作,使得交換之后的數(shù)列逆序?qū)﹄m少。
思路:
求原數(shù)列的逆序?qū)?#xff0c;再和k比就行了。求逆序?qū)σ脷w并排序,因?yàn)闃錉顢?shù)組開不下。
代碼:
#include<cstdio> #include<cstring> #include<climits> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<string> #include<queue> #include<map> #include<vector> #include<set> #include<sstream>using namespace std;long long _count;int _left[2500003], _right[2500003];void merge(int* a, int p, int q, int r) {int i, j, k, n1, n2;n1 = q-p+1;n2 = r-q;for (i=0; i<n1; i++){_left[i] = a[p+i];}for (i=0; i<n2; i++){_right[i] = a[q+i+1];}_left[n1] = _right[n2] = 0x7fffffff;i = j = 0;for (k=p; k<=r; k++){if (_left[i] <= _right[j]){a[k] = _left[i];i++;}else{a[k] = _right[j];j++;_count += n1-i; /**此步驟是在歸并排序法中加的一句,用來計(jì)數(shù)求逆序數(shù)的數(shù)目**/}}return; }void mergesort(int* a, int p, int r) {int q;if (p < r){q = (p+r)/2;mergesort(a, p, q);mergesort(a, q+1, r);merge(a, p, q, r);}return ; }int a[1000005];int main() {int n,m;int cas=1;while(EOF != scanf("%d %d",&n, &m) ) {_count=0;for(int i = 0; i < n; i++) {scanf("%d",&a[i]);}mergesort(a,0,n-1);int ans;_count-=m;int flag=0;for(int i=1;i<n;i++){if(a[i]==a[i-1]){flag=1;break;}}if(_count<0){_count=-_count;if(_count%2==0)ans=0;elseif(flag)ans=0;elseans=1;}elseans=_count;printf("Case #%d: %d\n",cas++,ans);}return 0; }總結(jié)
以上是生活随笔為你收集整理的hust1347(归并排序求逆序对)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hust1346(两个线段的最近距离和最
- 下一篇: hust1342(流量有上下界的最小流)