zoukankan      html  css  js  c++  java
  • hdu 4911 Inversion(找到的倒数)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911


    Inversion

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
    Total Submission(s): 528    Accepted Submission(s): 228


    Problem Description
    bobo has a sequence a1,a2,…,an. He is allowed to swap twoadjacent numbers for no more than k times.

    Find the minimum number of inversions after his swaps.

    Note: The number of inversions is the number of pair (i,j) where 1≤i<j≤n and ai>aj.
     
    Input
    The input consists of several tests. For each tests:

    The first line contains 2 integers n,k (1≤n≤105,0≤k≤109). The second line contains n integers a1,a2,…,an (0≤ai≤109).
     
    Output
    For each tests:

    A single integer denotes the minimum number of inversions.
     
    Sample Input
    3 1 2 2 1 3 0 2 2 1
     
    Sample Output
    1 2
     
    Author
    Xiaoxu Guo (ftiasch)
     
    Source

    解法:求的所给序列的逆序数。然后减掉k,假设小于零就去零!



    代码例如以下:(归并排序法)
    #include<stdio.h>
    
    int is1[112345],is2[112345];// is1为原数组,is2为暂时数组。n为个人定义的长度
    
    __int64 merge(int low,int mid,int high)
    {
    	int i=low,j=mid+1,k=low;
    	__int64 count=0;
    	while(i<=mid&&j<=high)
    		if(is1[i]<=is1[j])// 此处为稳定排序的关键,不能用小于
    			is2[k++]=is1[i++];
    		else
    		{
    			is2[k++]=is1[j++];
    			count+=j-k;// 每当后段的数组元素提前时。记录提前的距离
    		}
    		while(i<=mid)
    			is2[k++]=is1[i++];
    		while(j<=high)
    			is2[k++]=is1[j++];
    		for(i=low;i<=high;i++)// 写回原数组
    			is1[i]=is2[i];
    		return count;
    }
    __int64 mergeSort(int a,int b)// 下标,比如数组int is[5],所有排序的调用为mergeSort(0,4)
    {
    	if(a<b)
    	{
    		int mid=(a+b)/2;
    		__int64 count=0;
    		count+=mergeSort(a,mid);
    		count+=mergeSort(mid+1,b);
    		count+=merge(a,mid,b);
    		return count;
    	}
    	return 0;
    }
    int main()
    {
    	int n, x;
    	__int64 k;
    	__int64 sum;
    	while(scanf("%d%I64d",&n,&k)!=EOF)
    	{
    		for(int i=0;i<n;i++)
    		{
    			scanf("%d",&x);
    			is1[i] = x;
    		}
    		__int64 ans=mergeSort(0,n-1);
    		sum=0;
    		printf("%I64d
    ",ans-k>0?ans-k:0); 
    	}
    	return 0;
    }



  • 相关阅读:
    洛咕 P4131 [WC2005]友好的生物
    P3354 [IOI2005]Riv 河流
    洛咕 P3645 [APIO2015]雅加达的摩天楼
    洛咕 P4528 [CTSC2008]图腾
    CSDN不登录阅读全文(最新更新
    #6472. 「ICPC World Finals 2017」难以置信的任务 Mission Improbable
    #6435. 「PKUSC2018」星际穿越
    #2009. 「SCOI2015」小凸玩密室
    #2007. 「SCOI2015」国旗计划
    PKUWC2018题解
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4569360.html
Copyright © 2011-2022 走看看