http://codeforces.com/problemset/problem/556/B
题意:给定n个数字且都小于n,然后每次循环第2k+1个数字+1,第2k个数字减一,k=0,1,2...n/2. 问最后能不能使n个数字刚好为排列为0,1,2,....n-1.
题解:简单模拟就好了,循环次数设为n-1,因为n次循环后回到原来的排列。
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <ctime> 5 #include <iostream> 6 #include <algorithm> 7 #include <set> 8 #include <vector> 9 #include <sstream> 10 #include <queue> 11 #include <typeinfo> 12 #include <fstream> 13 #include <map> 14 #include <stack> 15 using namespace std; 16 typedef long long ll; 17 const int maxn=1010; 18 int n,a[maxn]; 19 int main() 20 { 21 scanf("%d",&n); 22 for(int i=0;i<n;i++) 23 scanf("%d",&a[i]); 24 int t=1,sum=0; 25 while(t<=n){ 26 for(int i=0;i<n;i++){ 27 if(a[i]==i) sum++; 28 if(i%2==0){ 29 if(a[i]==n-1) a[i]=0; 30 else a[i]+=1; 31 } 32 else{ 33 if(a[i]==0) a[i]=n-1; 34 else a[i]-=1; 35 } 36 } 37 if(sum==n) break; 38 else sum=0; 39 t++; 40 } 41 if(sum==n) printf("Yes "); 42 else printf("No "); 43 return 0; 44 }