CodeForces - 1136D Nastya Is Buying Lunch(模拟)

题目链接:

https://codeforces.com/contest/1136/problem/D

题目大意:

n个人排成一行,每个人每次最多只能和前面一个人交换位置。问最后一个人最多能前进多少位置。

思路:

参考了讨论区一位大佬的思路。最后一个人能前进多少位置,得看前面的人有多少能和最后一个人直接交换。
从倒数第二个人开始,如果这个人和原本的最后一个人直接相连,那么把这个人的位置往后推,直到他和最后一个人交换,最后统计原来队尾的人前进的位置即可。
以题目中的输入输出为例:

input
5 2
3 1 5 4 2
5 2
5 4
output
1

这里面最后一个数是2,2能往前进多少位置,得看前面有多少个数和2直接相连。样例中只有5与2直接相连,则把5的位置依次往后移,看最后能不能与最后的2交换,如果能,那么2就可以前进1位,反之,2便还是不能前进。

#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
map<pair<int,int>,int> mp1;
int a[300005];
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	for(int i=0;i<m;i++){
		int u,v;
		scanf("%d %d",&u,&v);
		mp1[mp(u,v)]=1;
	}
	
	int last=n-1;
	for(int i=n-2;i>=0;i--){
		if(mp1[mp(a[i],a[last])]){//前面的人和最后一个人直接相连才有可能进行交换
			
			int j;
			for(j=i;j<last;++j){
				if(mp1[mp(a[j],a[j+1])]){
					swap(a[j],a[j+1]);
				}
				else break;
			}
			
			if(j==last){//第i个人和最后一个人可以交换,最后一个人的位置往前移
				--last;
			}
		}
	}
	
	printf("%d\n",n-1-last);//统计交换的个数
	return 0;
} 
posted @ 2019-03-13 15:59  xzhws  阅读(52)  评论(0编辑  收藏  举报