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;
    }
  • 相关阅读:
    GUIX 创建工程注意事项
    VS 中bool和BOOL的区别
    git 在Windows上的应用
    rt-thread 相关网站地址
    tcp client
    VS2015 下载地址
    软件各种协议比较(GPL、AGPL、LGPL、Apache、Zlib/Libpng、BSD、MIT)
    UILabel标签
    UIbutton
    数据互转
  • 原文地址:https://www.cnblogs.com/KGW-/p/11734465.html
Copyright © 2011-2022 走看看