跳到主要内容

题解:CF2048B Kevin and Permutation

· 阅读需 2 分钟
lailai
Blogger

原题链接

题意简述

构造一个长度为 nn 的排列,最小化所有长度为 kk 的子区间的最小值之和。

解题思路

考虑每个长度为 kk 的子区间的最小值对结果的影响。为了最小化所有子区间的最小值之和,我们可以采取以下策略:

  • 从最小的数 11 开始,将 11 放置在位置 kk,这样前 kk 个区间的最小值为 11
  • 接着考虑数 22,将 22 放置在位置 2k2k,这样接下来的 kk 个区间的最小值为 22
  • 以此类推,将数 xx 放置在位置 xkxk,使得每个位置上的数尽可能影响到最少的区间,从而最小化区间的最小值之和。

对于剩下的数,可以随意放置,因为它们的放置不会影响已经确定的最小值。

参考代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--)
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cout<<(i%k?i+n/k-i/k:i/k)<<' ';
}
cout<<'\n';
}
return 0;
}