[POJ1804]Brainman

来源:互联网 发布:java 余弦相似度算法 编辑:程序博客网 时间:2024/05/17 03:37

假如我们要尽量少的次数交换元素 那么我们每次交换逆序对数一定是最优的 只有这样才能尽可能的去掉逆序对数的数量

因此就是求逆序对数

原谅我不会动态内存……只拿了G++里的第二 不过好歹混到第一页了

#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>#include<queue>#include<stack>#include<cstring>#include<set>#include<cstring>#include<iomanip>#define mid ((l+r)>>1)#define debug(x) cerr<<#x<<"="<<x<<endlusing namespace std;typedef pair<int,int> pii;const int INF = 0x7f7f7f7f;const double pi=acos(-1.0);int a[1001],ans=0;int temp[1001];inline int init(){int now=0,ju=1;char c;bool flag=false;while(1){c=getchar();if(c=='-')ju=-1;else if(c>='0'&&c<='9'){now=now*10+c-'0';flag=true;}else if(flag)return now*ju;}}void Mergesort(int l,int r){int pointer=l;int i=l,j=mid+1;while(i<=mid&&j<=r){if(a[i]>a[j]){temp[pointer++]=a[j++];ans+=(mid-i+1);}else{temp[pointer++]=a[i++];}}while(i<=mid){temp[pointer++]=a[i++];}while(j<=r){temp[pointer++]=a[j++];}for(int k=l;k<=r;k++){a[k]=temp[k];}return;}void Merge(int l,int r){if(l<r){Merge(l,mid);Merge(mid+1,r);Mergesort(l,r);}}int main(){int cas;short int n;cas=init();for(int i=1;i<=cas;i++){ans=0;n=init();memset(temp,0,sizeof(temp));for(int j=1;j<=n;j++){a[j]=init();}Merge(1,n);printf("Scenario #%d:\n%d\n\n",i,ans);}return 0;}


0 0
原创粉丝点击