-
I - Swaps and Inversions
- HDU - 6318
- 题意:给你一个长度为n的数列,开始检查,如果某两个数不是从小大大顺序的,有一个就罚x元,
- 或者也可以直接在检查之前对不符合要求的调换位置(相邻的)花费y元然后要你求最小的花费
- 思路:所以就是直接求这个序列的逆序数然后乘以x和y花费中较小的一个,逆序数可以归并求解
- 原理就是二路递归然后合并,正常 两边合并 左边 a[i]<=a[j]时不会产生逆序数的,但是如果a[i]>a[j]
- 此时a[j]就会产生它相应的逆序数,个数就是左边还剩下的比它大的数字,即 mid-i+1
-
#include<bits/stdc++.h> using namespace std; #define maxn 155500 #define ll long long int a[maxn],n,x; int y,cp[maxn]; ll ans,sum; void msort(int l,int r) { if(l>=r)return; int mid=(l+r)/2; msort(l,mid); msort(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid&&j<=r) { if(a[i]<=a[j]) cp[k++]=a[i++]; else { cp[k++]=a[j++]; sum+=mid-i+1; } } while(i<=mid) cp[k++]=a[i++]; while(j<=r) cp[k++]=a[j++]; for(int i=l; i<=r; i++) a[i]=cp[i]; } int main() { while(~scanf("%d%d%d",&n,&x,&y)) { sum=0; for(int i=1; i<=n; i++) scanf("%d",&a[i]); msort(1,n); if(x>y)x=y; ans=x*sum; printf("%lld\n",ans); } return 0; }
I - Swaps and Inversions HDU - 6318 -逆序数
最新推荐文章于 2019-07-30 19:27:31 发布
本文探讨了一个涉及数列逆序数计算的问题,通过归并排序算法优化解决方案,旨在找到调整数列顺序以最小化惩罚成本的方法。关键在于计算逆序数并通过比较操作成本与惩罚成本选择最优策略。
220

被折叠的 条评论
为什么被折叠?



