首页 > 代码库 > hdu--1394--加强版的逆序数
hdu--1394--加强版的逆序数
逆序数 很早前就求过了.
这次 遇到这题 本来以为是很简单的又可以直接求来输出 。
就是要稍微在多加一步先放题目~
touch me
大概讲下题意:
对于一个数组A[n]那么它的元素为A0,A1,A2....An-1
我们可以不断地将首位的元素移到最后 形成一个新的序列 就如A2,A3……An-1,A0,A1
对于每个这个序列 我们求出它的逆序数~ 这样的序列一共是有n个包括了最初的序列
这题解法 大概有3种吧~ 线段树 树状数组 归并排序
个人最烦 线段树 =-=
上午好困 被今天凌晨的巴德 折磨 虐心...
我暂时就用 归并做了 晚上有时间 会用树状数组或者线段树去做一次吧 练练~
晚些时候 贴上来 ~ (书不在身边 本想写下自己的见解 还是觉得给出最好的比较好...)
这样我们会求出最初那个序列的 逆序数个数为ANS 那另外还有n-1个序列怎么求呢?
你这样想 既然我们是要将首位的元素移到末位 那么原先是它的逆序数的个数X现在是不是就不是逆序数了吧?
反之 原先不是它的逆序数的个数y现在变成逆序数了!
所以 这样进行一次移位后 新的ANS就变成了 ANS - X + Y
想通这个 就可以解了
1 // 归并排序 2 3 #include <iostream> 4 #include <cstring> 5 using namespace std; 6 7 const int size = 5020; 8 int sum; 9 int arr[size];10 int temp[size];11 int cnt[size];12 13 void mergeSort( int x , int y )14 {15 int mid , p , q , i;16 if( y - x >1 )17 {18 mid = x + (y-x) / 2;19 p = x;20 q = mid;21 i = x;22 mergeSort( x , mid );23 mergeSort( mid , y );24 while( p<mid || q<y )25 {26 if( q>=y || ( p<mid && arr[p] <= arr[q]) )27 {28 temp[i++] = arr[p++];29 }30 else31 {32 temp[i++] = arr[q++];33 sum+=(mid-p);34 }35 }36 for( i = x ; i<y ; i++ )37 {38 arr[i] = temp[i];39 }40 }41 }42 43 int main()44 {45 int n , mmin;46 int p , q , num;47 while( ~scanf("%d",&n) )48 {49 sum = 0;50 for( int i = 0 ; i<n ; i++ )51 {52 scanf( "%d",&arr[i] );53 cnt[i] = arr[i];54 }55 mergeSort( 0 , n );56 mmin = sum; 57 for( int i = 0 ; i<n-1 ; i++ )58 {59 p = q = 0;60 num = cnt[0];61 for( int j = 1 ; j < n ; j++ )62 {63 cnt[j-1]=cnt[j];64 if( num<cnt[j] )65 {66 p++;67 }68 else if( num>cnt[j] ) 69 {70 q++;71 }72 }73 sum+=(p-q);74 if(sum<mmin) 75 {76 mmin = sum;77 }78 cnt[n-1]=num;79 }80 printf( "%d\n",mmin );81 }82 return 0;83 }
today:
你的喜贴是我的请贴
你邀我举杯
我只能回敬我的崩溃
在场的都知道
你我曾那么好
如今整颗心都碎了
你还要我微笑
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。