您的位置:首页 > 其它

codeforces 187A 模拟

2017-10-31 11:27 316 查看
题目:

http://codeforces.com/problemset/problem/187/A

先映射

1.找到最大值在A序列中的位置Max;

2.判断A是否满足递增,若不,将第一个大于它后一个的数的位置记为now;

3.显然,我们需要将now后一个移到now的前面,但又需要保证Max及大于now值de在now后面;

4.所以我们需要先将Max移到now前面,然后将now及now后面的数移到Max前面;

ans=Max-now+n-Max=n-now;

Max与now之间(包括now)的数移到Max前的代价 + 将Max移到now的代价

代码很短~;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int MAXN=3000001;
int a[MAXN],b[MAXN],pos[MAXN];
int n,ans,now,Max;

void solve()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]),pos[b[i]]=i;

for(int i=1;i<=n;i++)
{
a[i]=pos[a[i]];
if(a[i]==n) Max=i;
}

for(int i=2;i<=n+1;i++)
if(a[i]<a[i-1]) {now=i-1;break;}

cout<<n-now<<endl;
return;
}

int main()
{
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: