HDU 1394 Minimum Inversion Number
来源:互联网 发布:有关c语言的参考文献 编辑:程序博客网 时间:2024/05/21 10:04
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1394
题意:在序列 { 2, 4, 3, 1 } 中,逆序依次为 (2,1), (4,3), (4,1), (3,1),因此该序列的逆序数为 4,题目给定一个长度为n的数组,每次可以把数组的前m个元素移动到数列的后面,所以共有n种数列,求这n种序列中,逆序数最小的一个
思路:(1)从第一种情况,递推剩下的情况,如果把a[1]放到末尾,则逆序数减少a[1](从0到a[1]-1),逆序数增加n-(a[1]+1)(从a[1]+1到n)
(2)用sum数组标记到目前为止,这个数是否存,用线段树每次查询比它大的数有几个,初始的情况推出来了,剩下的情况和上面所用的方法一样
AC代码1:
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>#include <cctype>typedef long long ll;using namespace std;int a[5010];int main(){ int i,j; int n; while(scanf("%d",&n) != EOF) { for(i=0; i<n; i++) { scanf("%d",&a[i]); } int sum = 0; for(i=0; i<n; i++) { for(j=i+1; j<n; j++) { if(a[i] > a[j]) { sum++; } } } int min1 = sum; for(i=0; i<n; i++) { sum = sum - a[i] + n - 1 - a[i]; if(sum < min1) min1 = sum; } printf("%d\n",min1); }}
AC代码2:
#inlcude <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>#include <cctype>typedef long long ll;using namespace std;int a[5010];int cf[5010];//也可以每次在merge1函数里面每次开一个数组,这样比较省内存int lol[5010];int sum;void merge1(int b,int e){ int i = b; int mid = (b + e) / 2; int j = mid + 1; int temp = b; while(i <= mid && j <= e) { if(a[i] <= a[j]) { cf[temp++] = a[i]; i++; } else { cf[temp++] = a[j]; j++; sum += mid - i + 1;//i到mid都比这个数大 } } while(i <= mid) { cf[temp++] = a[i]; i++; } while(j <= e) { cf[temp++] = a[j]; j++; } for(i=b; i<=e; i++) { a[i] = cf[i]; }}void merge_sort(int b,int e){ if(b < e) { int mid = (b + e) / 2; merge_sort(b,mid); merge_sort(mid+1,e); merge1(b,e); }}int main(){ int i; int n; while(scanf("%d",&n) != EOF) { sum = 0; for(i=0; i<n; i++) { scanf("%d",&a[i]); lol[i] = a[i]; } merge_sort(0,n-1); int min1 = sum; for(i=0; i<n; i++) { sum = sum - lol[i] + n - 1 - lol[i]; if(sum < min1) min1 = sum; } printf("%d\n",min1); }}
AC代码3:
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>#include <cctype>const int inf = 0x3f3f3f3f;//1061109567typedef long long LL;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;const int maxn = 5010;int sum[maxn<<2],a[maxn];void pushup(int rt){ sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void build(int l,int r,int rt){ sum[rt] = 0; if(l == r) return; int m = (l + r) >> 1; build(lson); build(rson);}int query(int L,int R,int l,int r,int rt){ if(l >= L && r <= R) return sum[rt]; int m = (l + r) >> 1; int ans = 0; if(L <= m) ans += query(L,R,lson); if(R > m) ans += query(L,R,rson); return ans;}void updata(int p,int l,int r,int rt){ if(l == r) { sum[rt]++; return; } int m = (l + r) >> 1; if(p <= m) updata(p,lson); if(p > m) updata(p,rson); pushup(rt);}int main(){ int n; while(~scanf("%d",&n)) { build(0,n-1,1); int sum = 0; for(int i=0; i<n; i++) { scanf("%d",&a[i]); sum += query(a[i]+1,n-1,0,n-1,1); updata(a[i],0,n-1,1); } int min1 = sum; for(int i=0; i<n; i++) { sum = sum - a[i] + n - 1 - a[i]; if(sum < min1) min1 = sum; } printf("%d\n",min1); } return 0;}
0 0
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number
- HDU-1394-Minimum Inversion Number
- HDU 1394 - Minimum Inversion Number
- HDU 1394 Minimum Inversion Number
- Hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- hdu 1394 Minimum Inversion Number
- Hdu 1394 Minimum Inversion Number
- Minimum Inversion Number HDU 1394
- HDU 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number
- Minimum Inversion Number----hdu 1394
- 怎么学习阅读大型项目的代码
- cas单点登录搭建
- hdu2191——悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
- 当前是不是当下?
- JAVA – 虚函数、抽象函数、抽象类、接口
- HDU 1394 Minimum Inversion Number
- Android动态换肤(三、安装主题apk方式)
- hdu 1671 trie树
- 【vmstat】系统状态查看
- c++作业3
- 常用数据库语句的整理
- NYOJ 42 一笔画问题
- 动画
- swif开发