数据结构 跑跑卡丁车

数据结构与算法实验题 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);
}

           
           

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值