hdu 4657 Find Permutation

思路:用一个数组index[]存放a的下标,初始化令a[i]=c[i]=index[i]=i;

假设当前处理的i,初始时令cur=i;j为大于i的任意值。每次操作找a[l]=c[cur]-b[cur]。

若cur==l则结束;否则交换a[l]和a[cur]的值以及下标。若l>i,那么结束;否则令cur=l,

然后交换c[cur]和c[j],继续处理知道该轮结束。

代码如下:

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<iomanip>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<cstring>
 8 #include<vector>
 9 #define ll __int64
10 #define pi acos(-1.0)
11 #define MAX 100005
12 #define mod 1000003
13 using namespace std;
14 int a[MAX],b[MAX],c[MAX],index[MAX];
15 int main(){
16     int t,n,i,j;
17     scanf("%d",&t);
18     while(t--){
19         scanf("%d",&n);
20         for(i=0;i<n;i++) scanf("%d",&b[i]);
21         for(i=0;i<n;i++) a[i]=c[i]=index[i]=i;
22         for(i=0;i<n;i++){
23             int cur=i;
24             while((a[cur]+b[cur])%n!=c[cur]){
25                 int l = index[(c[cur]-b[cur]+n)%n];
26                 swap(a[l],a[cur]);
27                 swap(index[a[l]],index[a[cur]]);
28                 if(l>i) break;
29                 cur=l;
30                 swap(c[i+1],c[cur]);
31             }
32         }
33         for(i=0;i<n;i++){
34             printf("%d",a[i]);
35             if(i!=n-1) printf(" ");
36             else printf("\n");
37         }
38         for(i=0;i<n;i++){
39             printf("%d",c[i]);
40             if(i!=n-1) printf(" ");
41             else printf("\n");
42         }
43     }
44     return 0;
45 }
View Code

 

 

 

posted @ 2013-08-09 15:46  _随心所欲_  阅读(400)  评论(0编辑  收藏  举报