资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

CF1741BFunnyPermutation题解-创新互联

题意简述

输入一个整数 n n n,要求构造一个长度为 n n n 的排列 p p p, p i ∈ [ 1 , n ] p_i \in [1,n] pi​∈[1,n],并同时满足以下两点要求:

创新互联公司执着的坚持网站建设,小程序设计;我们不会转行,已经持续稳定运营十余年。专业的技术,丰富的成功经验和创作思维,提供一站式互联网解决方案,以客户的口碑塑造品牌,携手广大客户,共同发展进步。
  • 对于排列中的每一个元素,满足在和它相邻的元素中至少有一个元素和它的值相差 1 1 1。
  • 下标从 1 1 1 开始,每个下标对应的元素不能和下标相等,形式化的,对于每一个 i ∈ [ 1 , n ] i \in [1,n] i∈[1,n] 都必须满足 p i ≠ i p_i \neq i pi​=i。

如果可以构造,输出构造的排列。
如果不可以,输出 − 1 -1 −1。

题目分析

构造题,首先考虑第一个要求,先想到的就是按顺序排列,但是为了满足各个下标对应元素不能和下标相等,再考虑顺序移动一位,后边的补到前边,但这样就会导致最前边的元素无法满足第一个要求,所以整体向后顺序移动两位,溢出的部分补到前边。

要注意的是,顺序向后移动两位之后还要保证剩下的部分也满足第一个条件,因此这样的操作只适用于 n ≥ 4 n \geq 4 n≥4 的情况,那么对于 n = 1 , 2 , 3 n={1,2,3} n=1,2,3 的情况我们可以特判一下。

因此,下面代码中的 check 函数我只判断了是否满足第二个要求。

形式化的,对于 n ≥ 4 n \geq 4 n≥4的情况,我们在要构造的排列中先放入 n − 1 n-1 n−1 和 n n n,然后依次放入 1 1 1 到 n − 2 n-2 n−2 即可。

代码
#includeusing namespace std;

inline long long read()
{long long x = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch))
    {if (ch == '-')
        {f = -1;
        }
        ch = getchar();
    }
    while (isdigit(ch))
    {x = (x<< 1) + (x<< 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

bool check(vector&v)
{for (ll i = 0; i< v.size(); i++)
    {if (v[i] == i + 1)
        {return false;
        }
    }
    return true;
}

void solution()
{ll n = 0;
    n = read();

    if (n == 1)
    {cout<< -1<< endl;
        return;
    }
    if (n == 2)
    {cout<< 2<< ' '<< 1<< endl;
        return;
    }
    if (n == 3)
    {cout<< -1<< endl;
        return;
    }
    vectornums;
    nums.push_back(n - 1);
    nums.push_back(n);
    for (ll i = 1; i<= n - 2; ++i)
    {nums.push_back(i);
    }
    if (check(nums))
    {for (ll i = 0; i< nums.size(); i++)
        {cout<< nums[i]<< " ";
        }
        cout<< endl;
    }
    else
    {cout<< -1<< endl;
    }
}

int main()
{ll T = 0;
    T = read();
    for (ll i = 0; i< T; i++)
    {solution();
    }

    return 0;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:CF1741BFunnyPermutation题解-创新互联
网页网址:http://cdkjz.cn/article/dgphgh.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220