栈排序(简化版)

题目描述

查看题目信息

众所周知,栈是一种很好玩的数据结构。现在,在金牌同学 cys 的面前有两沓试卷,数学老师给了他 “把这些试卷按照成绩从高到低排序” 的任务。

cys 同学做事谨慎,它怕把卷子拿起来会把卷子弄乱,故每一次他只会动每一沓卷子的最顶上的那一张,也就是说只会干这两件事情:

  1. 把一张卷子从一沓卷子的顶端,挪到另外一沓卷子的顶端,这一个操作会让他的疲劳值增加 (疲劳值初始为 )。

  2. 如果一张卷子位于任意一沓卷子的顶端,cys 可以把它拿走交给老师。

cys 想把卷子从最高分到最低分依次交给老师,请问它最少积累的疲劳值是多少?

cys 觉得这个问题好像和栈有点关系,便交给了你来解决,哦,他还说过,这次考试不知道为什么,没有两个人考到了同样的分数,具体来讲,所有卷子的分数两两不同。

另外还请注意,操作过程中可以将一沓卷子拿成空的,此时它不存在顶部卷子,无法从其中拿卷子,但若另一堆有卷子的话,仍可以把其他卷子放上来。

输入格式

第一行两个非负整数 ,分别代表两沓试卷中分别有多少张卷子。

第二行 个整数, ,依次代表第一沓试卷中从底部到顶部每一张卷子的分数。

第三行 个整数,​ ,依次代表了第二沓试卷中从底部到顶部每一张卷子的分数。

输出格式

一行,一个整数 ​ ,代表最小疲劳值。

样例输入

2 2
2 3
1 4

样例输出

0

样例输入

2 2
3 2
1 4

样例输出

1

问题提示

说明/提示

样例1:我们如果按照 的顺序拿卷子交给老师,发现每次拿之前那张卷子都在最顶上,故不需要额外挪动卷子,答案为 。

样例2:我们执行以下操作:

  • 将 交给老师

  • 把 挪到另一堆的顶上

  • 把 交给老师

  • 把 交给老师

  • 把 ​ 交给老师

得到了最优的答案 ​ 。

数据范围

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stack>
using namespace std;
int a,b;
int x[400005];
stack <int> s1,s2;
int site[1000005];
bool cmp(int a,int b){
    return a>b;
}
int main(){
    int v,cnt=0,sum=0;
    cin>>a>>b;
    for(int i=1;i<=a;i++){
        cin>>v;
        s1.push(v);
        site[v]=1;
        x[++cnt]=v;
    }
    for(int i=1;i<=b;i++){
        cin>>v;
        s2.push(v);
        site[v]=2;
        x[++cnt]=v;
    }
    sort(x+1,x+cnt+1,cmp);
    for(int i=1;i<=cnt;i++){
        if(site[x[i]]==1){
            while(!s1.empty()&&s1.top()!=x[i]){
                int t=s1.top();
                s1.pop();
                site[t]=2;
                s2.push(t);
                sum++;
            }
            if(!s1.empty())
                s1.pop();
        }else if(site[x[i]]==2){
            while(!s2.empty()&&s2.top()!=x[i]){
                int t=s2.top();
                s2.pop();
                site[t]=1;
                s1.push(t);
                sum++;
            }
            if(!s2.empty())
                s2.pop();
        }
    }
    cout<<sum;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值