I 排序

A


Description:

  • 一叠卡牌有 n 张,每张卡牌上面写有一个数字,从上往下数第 i 张卡牌上面写的数字为 ai,每张卡牌上面写的数字互不相等,并且数字都在 [1,n] 的范围内。现在要把卡牌整理成顺序卡牌(卡牌堆从上到下第 i 张卡牌上面写着数字 i )。 可是这叠卡牌被诅咒过,对卡牌的操作只能按以下规则执行:
  • 选择牌堆中任意一张卡牌,从卡牌堆中抽出,并将其放置于牌堆顶。
  • 请问最少需要执行几次这样的操作可以将卡牌整理成顺序卡牌

Constraints:

  • 1n3×105
  • 1ain
  • i,j(1i<jn)aiaj

Analysis:

  • 最多要进行 n1 次操作,只要某个数比前面小,就要调整顺序,故可以从后遍历,找到最长的接续序列,如 n,n1,n2,···,最小操作次数即为总长度减去该序列的长度。

Solution:

void solve() {
	int n; cin >> n;
	vector<int> v;
	for(int i=0;i<n;i++) {
		int x; cin >> x;
		v.push_back(x);
	}
	int ans = n;
	for(int i=n-1;i>=0;i--) {
		if(v[i] == ans) ans --;
	}
	cout << ans << endl;
}
posted @   Trilliverse  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
点击右上角即可分享
微信分享提示