数据结构 跑跑卡丁车

来源:互联网 发布:景安网络手机版 编辑:程序博客网 时间:2024/04/28 15:16

数据结构与算法实验题 7.2  跑跑卡丁车
★实验任务
有 n 辆卡丁车车牌号分别为 1,2,…,n 在高速公路上竞速。Coffee 是位跑跑卡丁车爱
好者,她在比赛的过程中拍摄了两张照片,在照片上可以清晰的看到每辆车的的车牌号。
给出两张照片上从第一名到最后一名的车牌号,请你编程计算这两张照片的拍摄时间段内
至少发生了几次超车。
★数据输入
输入第一行包括一个正整数 n(1<=n<=50000),表示卡丁车数量。接下来两行,每行
包括 n 个整数,表示照片上从第一名到最后一名的车牌号(1 到 n 的全排列),每两个数之
间用一个空格隔开。
★数据输出
输出仅有一个数,即至少发生的超车次数,答案在 int 型范围内。
 
输入示例  输出示例
4  5
2 3 4 1
4 1 3 2

 

 

很简单,归并最直接,当然也可以用二叉树,线段树来实现,主要就是计算逆序对数,因此要先规定一个其中一个数组为标准排列即1。。。n

代码

 
#include<stdio.h>
int a[50002]={0},b[50002]={0},step=0;
void mst(int *k,int *kl,int first,int last){
 if (first<last){
  int mid=(first+last)/2;
  mst(kl,k,first,mid);
  mst(kl,k,mid+1,last);
  last++;
  int s=first,t=++mid,i,j=first;
 while (s<mid&&t<last)
 {
  if (k[s]<=k[t])
  kl[j++]=k[s++];
  else {
   kl[j++]=k[t++];
   step+=mid-s;
  }
 }
 while(s<mid)
  kl[j++]=k[s++];
 while(t<last)
  kl[j++]=k[t++];
 }
}
main(){
 int i,j,n;
 scanf("%d",&n);
 n++;
 for(i=1;i<n;i++)
  scanf("%d",&a[i]);
 for(i=1;i<n;i++){
  scanf("%d",&j);
  b[j]=i;
 }
 
 for(i=1;i<n;i++)
 a[i]=b[a[i]];
 for(i=1;i<n;i++)
  b[i]=a[i];
 mst(a,b,1,n-1);  
 printf("%d/n",step);
}

           
           

 

原创粉丝点击