第一周周六CODEFORCES真题
E - 04 CodeForces - 347B
A permutation of length n is an integer sequence such that each integer from 0 to (n - 1) appears exactly once in it. For example, sequence [0, 2, 1] is a permutation of length 3 while both [0, 2, 2] and [1, 2, 3] are not.
A fixed point of a function is a point that is mapped to itself by the function. A permutation can be regarded as a bijective function. We’ll get a definition of a fixed point in a permutation. An integer i is a fixed point of permutation a0, a1, …, an - 1 if and only if ai = i. For example, permutation [0, 2, 1] has 1 fixed point and permutation [0, 1, 2] has 3 fixed points.
You are given permutation a. You are allowed to swap two elements of the permutation at most once. Your task is to maximize the number of fixed points in the resulting permutation. Note that you are allowed to make at most one swap operation.
Input
The first line contains a single integer n (1 ≤ n ≤ 105). The second line contains n integers a0, a1, …, an - 1 — the given permutation.
Output
Print a single integer — the maximum possible number of fixed points in the permutation after at most one swap operation.
Example
Input
5
0 1 3 4 2
Output
3
这道题思路比较简单,直接遍历数组,找出满足a[i]==i的项的个数countx,然后将不符合的存放在新数组b[i]里面,之后循环比较a[b[i]]==i,如果满足则countx+2;如果不满足则只能countx+1;#特别注意当countx就等于n时,不需要countx++;下面贴代码。
#include <iostream>
#include <malloc.h>
#include <algorithm>
#include <cstring>
using namespace std;
int a[100010];
int b[100010];
int main()
{
memset(a,-1,sizeof(a));
memset(b,-1,sizeof(b));
int i, n, countx=0;
int flag=0,flag0=0;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++){
if(a[i]!=i){
b[i]=a[i];
flag=1;
}
else {
countx++;
}
}
for(i=0;i<n;i++){
if(a[i]!=i){
if(a[b[i]]==i){
flag0=1;
break;
}
}
}
if(flag0==1){
countx+=2;
cout<<countx<<endl;
}
else if(flag==1){
countx++;
cout<<countx<<endl;
}
else cout<<countx<<endl;
return 0;
}
诶,还需要努力啊,今天到此为止,回宿舍困高了,对了,小桃估计还没睡觉,但是他不帮我晒衣服怎么办???急!在线等~