码迷,mamicode.com
首页 > 其他好文 > 详细

poj 2299

时间:2014-06-18 14:41:06      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:class   blog   for   amp   io   div   

题意:给定一个整数序列 问 只允许相邻的两个数交换 至少需要交换多少次

思路:归并排序

#include<stdio.h> 
__int64 count;
int array[500001],temp[500001]; 
void merge(int array[],int p,int q,int r) /////  p < = q < r 
{ 
    int begin1,end1,begin2,end2,k,i; 
    begin1=p; 
    end1=q; 
    begin2=q+1; 
    end2=r; 
    k=0; 
    while(begin1<=end1 && begin2<=end2) 
    { 
        if(array[begin1] < array[begin2]) 
        { 
            temp[k++]=array[begin1]; 
            begin1++; 
            count+=begin2-(q+1); 
        } 
        else 
        { 
            temp[k++]=array[begin2]; 
            begin2++; 
        } 
    } 
    while(begin1<=end1) 
    { 
        temp[k++]=array[begin1]; 
        begin1++; 
        count+=end2-q; 
    } 
    while(begin2<=end2) 
    { 
        temp[k++]=array[begin2]; 
        begin2++; 
    } 
    for(i=p;i<=r;i++) 
        array[i]=temp[i-p]; 
} 
void mergesort(int array[],int first,int last) 
{ 
    int mid=(first+last)/2; 
    if(first<last) 
    { 
        mergesort(array,first,mid); 
        mergesort(array,mid+1,last); 
        merge(array,first,mid,last); 
    } 
} 
int main() 
{ 
    int i,n;
    while(scanf("%d",&n)!=EOF) 
    { 
		if(n==0) break;
        for(i=1;i<=n;i++) 
            scanf("%d",&array[i]); 
        count=0; 
        mergesort(array,1,n);
        printf("%I64d\n",count); 
    } 
    return 0; 
}

 

poj 2299,布布扣,bubuko.com

poj 2299

标签:class   blog   for   amp   io   div   

原文地址:http://www.cnblogs.com/zhangdashuai/p/3791465.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!