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的代价
代码很短~;
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; }
相关文章推荐
- Codeforces 724C [坐标][乱搞][模拟]
- CodeForces 551A GukiZ and Contest(模拟)
- Codeforces 67A Partial Teacher(模拟)
- CodeForces - 868B Race Against Time(模拟)
- codeforces 116A Tram(模拟水题)
- codeforces 266A Stones on the Table(模拟水题)
- CodeForces 294B Shaass and Bookshelf 【规律 & 模拟】或【Dp】
- codeforces 705C C. Thor(模拟)
- Codeforces 911E 简单模拟
- Codeforces 758C Unfair Poll 暴力模拟
- [codeforces] C - Efim and Strange Grade 模拟+贪心
- Codeforces 309C Memory for Arrays 二进制模拟进位
- 【CodeForces 803B】Distances to Zero(模拟)
- Codeforces 906A Shockers (模拟)
- CodeForces - 665B Shopping(模拟)
- 【模拟】Codeforces 671B Robin Hood
- 【并查集】【模拟】Codeforces 698B & 699D Fix a Tree
- 【模拟】Codeforces 710B Optimal Point on a Line
- CodeForces 260A Adding Digits 模拟
- codeforces 711B. Chris and Magic Square【模拟】