POJ 1804 Brainman && zzulioj 1470: Car race game(归并排序)

来源:互联网 发布:java小游戏开发 编辑:程序博客网 时间:2024/05/18 13:44

巩固基础,在看算法导论.看到归并排序顺便做两道。

POJ这个题目是只能交换相邻两个数字,问最少需要多少次交换使得数列非递减..

zzulioj这个题目是给定车子的坐标以及速度,问会出现多少次超车。

都是归并排序求逆序对的题目...

附上POJ 1804 代码:

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;#define N 1050int a[N],tmp[N];int ans;void Merge(int l,int m,int r){    int i = l;    int j = m + 1;    int k = l;    while(i <= m && j <= r)    {        if(a[i] > a[j])        {            tmp[k++] = a[j++];            ans += m - i + 1;        }        else            tmp[k++] = a[i++];    }    while(i <= m)        tmp[k++] = a[i++];    while(j <= r)        tmp[k++] = a[j++];    for(int i = l;i <= r;i++)        a[i] = tmp[i];}void Merge_sort(int l,int r){    if(l < r)    {        int m = (l + r) >> 1;        Merge_sort(l,m);        Merge_sort(m+1,r);        Merge(l,m,r);    }}int main(){    int T,cas = 1;    cin>>T;    while(T--)    {        int n;        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        ans=0;        Merge_sort(1,n);        printf("Scenario #%d:\n%d\n\n",cas++,ans);    }    return 0;}


0 0
原创粉丝点击