欢迎光临
我们一直在努力

【题解-信息学奥赛一本通】1328:【例7.7】光荣的梦想

题目:1328:【例7.7】光荣的梦想

题目描述:

Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯。在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界、保卫这里的平衡与和谐。在那个时代,平衡是个梦想。因为有很多奇异的物种拥有各种不稳定的能量,平衡瞬间即被打破。KB决定求助于你,帮助他完成这个梦想。

一串数列即表示一个世界的状态。

平衡是指这串数列以升序排列。而从一串无序数列到有序数列需要通过交换数列中的元素来实现。KB的能量只能交换相邻两个数字。他想知道他最少需要交换几次就能使数列有序。

输入:

第一行为数列中数的个数n,第二行为n <= 10000个数。表示当前数列的状态。

输出:

输出一个整数,表示最少需要交换几次能达到平衡状态。

时空限制

1s / 64 MB

样例输入:

4
2 1 4 3

样例输出:

2

思路

相邻交换一次,最多消除一个逆序对。这道题考察的是求逆序对数量。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,a[N],tmp[N];
long long merge_sort(int l,int r){
if(l>=r) return 0;
int mid=l+r >>1;
long long res=merge_sort(l,mid)+merge_sort(mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r){
if(a[i]<=a[j]) tmp[k++]=a[i++];
else{
tmp[k++]=a[j++];
res+=midi+1;
}
}
while(i<=mid) tmp[k++]=a[i++];
while(j<=r) tmp[k++]=a[j++];
for(int i=l,k=0;i<=r;i++,k++) a[i]=tmp[k];
return res;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
printf("%lld",merge_sort(0,n1));
return 0;
}

结果

在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » 【题解-信息学奥赛一本通】1328:【例7.7】光荣的梦想
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址