zoukankan      html  css  js  c++  java
  • CF482A

    求 n 的一个全排列,使其两两之间存在 K 种差值 1 ≤ n,K ≤ 10^5

    思路:1-n 最多凑出 n-1 种差值所以让前 k+1 项差值为 1 到 k,后面的 差值全为 1

    形如 1 7 2 6 3 5 4 这样差值是 6 5 4 3 2 1

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    #define maxn 100010
    #define ll long long
    #define IL inline
    #define clear(a) memset(a,0,sizeof a)
    
    int n,k,tot,delate;
    int a[maxn],lazy[maxn];
    
    int main()
    {
        a[1]=1,lazy[1]=1;
        scanf("%d%d",&n,&k);
        delate=n-1;
        for(int i=2;i<=n;i++){
            if(tot<k-1){
                if(a[i-1]+delate<=n&&!lazy[a[i-1]+delate]){
                    a[i]=a[i-1]+delate,tot++,lazy[a[i-1]+delate]=1,delate--;
                    continue;
                }
                if(a[i-1]-delate>=1&&!lazy[a[i-1]-delate]){
                    a[i]=a[i-1]-delate,tot++,lazy[a[i-1]-delate]=1,delate--;
                    continue;
                }
                    
            }
            else{
                if(!lazy[a[i-1]+1]&&a[i-1]+1<=n){
                    a[i]=a[i-1]+1,lazy[a[i-1]+1]=1;
                }
                else if(!lazy[a[i-1]]-1&&a[i-1]-1>=1)
                    a[i]=a[i-1]-1,lazy[a[i-1]-1]=1;
            }
        }
        for(int i=1;i<=n;i++)
            printf("%d ",a[i]);
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    108.异常的传递
    107.捕获异常
    106.异常、模块(异常介绍)
    105.面向对象案例-烤红薯
    104.多态案例
    103.继承案例二
    102.继承案例一
    101.自定义玩家类
    100.自定义枪类
    python基础入门之十四 —— 文件操作
  • 原文地址:https://www.cnblogs.com/KGW-/p/11734465.html
Copyright © 2011-2022 走看看