HDU 4911 水

对于n个数,可以做k次移动,每次移动可以互换相邻位置的两个数,问最少 number of pair (i,j) where 1≤i<j≤n and ai>aj.

如果不移动的话,ans=’n个数的逆序对数‘,移动k次会减少k个

归并排序求逆序对数:

#include "stdio.h"
#include "string.h"
#include "math.h"
int b[100010],a[100010],mark[100010];
__int64 k,ans;

void merge(int l,int mid,int r)
{
    int i,j,m;
    i=l;
    j=mid+1;
    m=0;

    while (i<=mid && j<=r)
    {
        if (a[i]<=a[j])
            mark[m++]=a[i++];
        else
        {
            mark[m++]=a[j++];
            ans+=mid-i+1;
        }
    }

    while (i<=mid)
        mark[m++]=a[i++];
    while (j<=r)
        mark[m++]=a[j++];

    for (i=0;i<m;i++)
        a[l+i]=mark[i];
}

void mergesort(int l,int r)
{
    int mid;
    if (l<r)
    {
        mid=(l+r)/2;
        mergesort(l,mid);
        mergesort(mid+1,r);
        merge(l,mid,r);
    }
}

int main()
{
    int n,i,min;
    while (scanf("%d%d",&n,&k)!=EOF)
    {
        for (i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            b[i]=a[i];
        }

        ans=0;

        mergesort(0,n-1);
        ans-=k;
        if (ans<0) ans=0;

        printf("%I64d\n",ans);

    }
    return 0;
}

HDU 4911 水

时间: 2024-10-12 15:56:40

HDU 4911 水的相关文章

HDU 4968 (水dp 其他?)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <map> 6 using namespace std; 7 const int inf = 0x3f3f3f3f; 8 const int MAX = 200+10; 9 double GPA[10],dp1[20][30000],dp2[20][30000

HDU 4911 Inversion 求逆序数对

点击打开链接 Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1106    Accepted Submission(s): 474 Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two adjacent num

2014多校联合五(HDU 4911 HDU 4915 HDU 4920)

HDU 4911 Inversion 题意:n个数字  通过k次相邻交换  使得逆序对数最少 思路:如果序列为 XXXABYYY  假设A和B位置互换  易知X和AB.Y和AB的逆序对数不变  换句话说一次交换最多使逆序对减少1  那么只需要求原逆序对数和k进行比较即可 代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100100 type

hdu 4911 Inversion

Inversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 197    Accepted Submission(s): 82 Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two adjacent numbers for

HDU 4911 Inversion(归并求逆序对)

HDU 4911 Inversion 题目链接 题意:给定一个数组,可以相邻交换最多k次,问交换后,逆序对为多少 思路:先利用归并排序求出逆序对,然后再减去k就是答案 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 100005; int n, num[N], save[N], sn; void init() { for

hdu 4911 Inversion(归并)

题目链接:hdu 4911 Inversion 题目大意:给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 解题思路:每交换一次一定可以减少一个逆序对,所以问题转换成如何求逆序对数. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 1e5+5; ll k

hdu 4416 水题 浙大计算机研究生复试上机考试-2005年 可是发现自己写代码有问题

Spring3与Hibernate4整合时出现了nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider. hibernate3的时候,用spring来控制sessionfactory用的可以是org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean,因为用的是hibernate4所以照猫画

2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)

题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后来终于想出来这根本就是求逆序数嘛,可以用归并排序,也可以用树状数组,不过我们用树状数组做错了,也不知道为什么.求出逆序数来再减掉k次,就可以求出最终结果来了.求逆序数链接1,链接2 1 #include <stdio.h> 2 3 int left[250003], right[250003];

hdu 4911 Inversion(归并排序求逆序对数)

Inversion                                                                             Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description bobo has a sequence a1,a2,-,an. He is allowed to swap two