洛谷 AT3525 题解

洛谷题目传送门 | AT 原题传送门

思路

分析题目可以很简单地得到,如果满足 pi=ip_i=i 的条件,那么交换 pip_ipi+1p_{i+1} 后得到的结果一定是最优解。

我们要做的只是从前到后遍历一遍 pp 数组,如果 pi=ip_i=i 就交换 pip_ipi+1p_{i+1},同时 ansans 累加。

看到楼下有大佬说当 i=ni=n 是需要特判,但其实完全不需要,只要数组开的够大,也不会在交换 pnp_npn+1p_{n+1} 时发生越界情况。但为了严谨也可以特判。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,p[100010];
int ans=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
}
for(int i=1;i<=n;i++)
{
if(p[i]==i)
{
ans++;//答案数量增加
swap(p[i],p[i+1]);//交换p[i]和p[i+1]
}
}
printf("%d\n",ans);
return 0;
}


洛谷 AT3525 题解
https://blog.makerlife.top/post/solution-AT3525/
作者
Makerlife
发布于
2022年2月7日
许可协议