(贪心)CF1136D Nastya Is Buying Lunch

CF1136D Nastya Is Buying Lunch

题意&思路:

有n个人排队,编号为a[i]的排在第i为,Nastya排在最后一位。给你一些可以交换的编号(x,y),当且仅当x排在y前面并且相邻的时候才可以交换位置。问Nastya最多向前移动多少位。
真的好菜,刚开始还看错题了,以为不相邻也能交换,纠结了很长时间。之后知道是贪心,却只有一点模糊的思路,又纠结了几个小时。然后看了大佬的思路才写完。
这个很巧妙的办法就是如果一个人x距离Nastya为l,并且他可以和后面交换l次,那Nastya一定可以到他的位置上。

代码:

#include<bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
const int N=5e5+10;
const int mod=1e7+9;
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
int a[N],vis[N]={0};
vector<int> b[N];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n,m,i,j;
	cin>>n>>m;
	for(i=1;i<=n;i++)
		cin>>a[i];
	for(i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		b[u].push_back(v);
	}
	vis[a[n]]=1;
	int ans=0;
	for(i=n-1;i>=1;i--)
	{
		int tot=0;
		for(j=0;j<b[a[i]].size();j++)
			if(vis[b[a[i]][j]])
				tot++;
		if(tot+i+ans==n)
			ans++;
		else
			vis[a[i]]=1; 
	}
	cout<<ans<<endl;
	return 0;
}

发布了78 篇原创文章 · 获赞 0 · 访问量 1401

猜你喜欢

转载自blog.csdn.net/Z7784562/article/details/103964302
今日推荐