CF482A Diverse Permutation

題目給定N 和 K, 要求構造一組排列,第i 項的數值和i + 1項的差絕對值要有k種。

思路:

1. 對於有序排列,變化只有一種。

2. 而N 個元素的排列,最多只有N - 1種變化。

我們先想一想如何構造N - 1種變化,再利用 第一點思路把N - 1種變化變成k種變化。

可以知道要達到N - 1種變化,只有頭尾元素輪換才可以達成,就以N = 6來舉例

[6, 1, 5, 2, 4, 3] 變化為N - 1種。

那麼我們現在考慮如何把變化縮減,繼續以N = 6舉例,考慮k = 3。

[6, 1, 5, 4, 3, 2]  可以看出當k為3,我們只要把第3位之後的排序變為有序,變化就只有一種了。

我一開始做的時候,直接把他統一變為降序,發現出錯了,因為當k 為奇數時,他是最大值要採用降序,當k為雙數的時候要採用升序,因為k的位置為最小值。

那麼只要把k的情況劃分就可以完成了。

#include <iostream>
using namespace std;
int main(){
    int n, k;
    cin >> n >> k;
    int x = n, y = 1;
    if(k % 2){
        for(int i = 1; i <= n; i++){
            if(i % 2 && i < k + 1) cout << x-- << " ";
            else if(!(i%2) && i < k) cout << y++ << " ";
            else cout << x-- << " ";
        }
    }else{
        for(int i = 1; i <= n; i++){
            if(i % 2 && i < k + 1) cout << x-- << " ";
            else cout << y++ << " ";
        }
    }

    return 0;
}

構造題

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值