题目描述
查看题目信息
众所周知,栈是一种很好玩的数据结构。现在,在金牌同学 cys 的面前有两沓试卷,数学老师给了他 “把这些试卷按照成绩从高到低排序” 的任务。
cys 同学做事谨慎,它怕把卷子拿起来会把卷子弄乱,故每一次他只会动每一沓卷子的最顶上的那一张,也就是说只会干这两件事情:
-
把一张卷子从一沓卷子的顶端,挪到另外一沓卷子的顶端,这一个操作会让他的疲劳值增加 (疲劳值初始为 )。
-
如果一张卷子位于任意一沓卷子的顶端,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;
}