zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Linux常用命令整理
    Linux脚本无法进入目录
    mysql5.7.初始化后,临时密码过期
    通过scp 命令向远程Linux服务器传输文件
    Linux进入单用户模式修改root密码
    Kali Linux安装谷歌输入法
    kali 安装pip命令
    CentOS 7 防火墙设置
    CentOS7 安装python 3.7
    CentOS 7安装完成之后无法联网
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3248414.html
Copyright © 2011-2022 走看看