• 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("
    ");
    37         }
    38         for(i=0;i<n;i++){
    39             printf("%d",c[i]);
    40             if(i!=n-1) printf(" ");
    41             else printf("
    ");
    42         }
    43     }
    44     return 0;
    45 }
    View Code
  • 相关阅读:
    一生要做的99件事
    Flash 简单的Mouse.hide()
    [转]FCKeditor
    [转]pv是什么意思?什么是pv值,pv访问量?网站pv是什么?
    CSS:用DIV+CSS实现表格形式的数据排列
    css "Float"
    Jemin的div+css测试文件
    原来
    我终于知道什么情况下得用table了
    转的 关于div 的重叠
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3248414.html
Copyright © 2020-2023  润新知