AtCoder BC072 D: Derangement
問題
https://beta.atcoder.jp/contests/abc072/tasks/arc082_b
解法
左から順にpiをみていきます。
・pi ≠ iの時 何もせずに、右に1つ進む
・pi = iの時 次の数と入れ替えて、右に2つ進む。このとき、次の数(pi+1)がi+1かどうかは特に意識する必要は無い。どちらの場合も、入れ替え後に条件を満たすため。
なお、数列の右端がpi = iの場合は、一つ前の数と入れ替えればOK。
以上です。
ちょっと400点とは思えないほど簡単です。
実装
#include<iostream> #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define MOD 1000000007 using namespace std; typedef long long int ll; const ll INF=(ll)1e18; int main(){ int N; cin >> N; int p[N]; REP(i,N)cin >> p[i]; int i = 0; int ans = 0; while(i < N){ if(p[i] == i + 1){ ans += 1; i += 2; }else{ i++; } } cout << ans << endl; }