构造、贪心

不会 *1100 贪心,大败而归。

给定长度为 $n$ 的序列 $a$,其中 $a_i = i$ 且 $n$ 为奇数。

将序列 $a$ 分割为奇数个包含奇数个元素的连续子序列,使得这些子序列中位数的中位数为给定的数 $k$ 或者判断无解。

假设 $n=15$,手动构造几个例子。

  • $k = 2$,$[1],[2],[3,15]$
  • $k = 3$,$[1],[2],[3],[4],[5,15]$
  • $k = 4$,$[1,3],[4],[5,15]$
  • $k = 5$,$[1,3],[4],[5],[6],[7,15]$

发现 $k$ 为偶数时只需要把序列分成 $3$ 段;若 $k=1$ 或 $k=n$ 则无解,否则只需要把序列分成 $5$ 段。

时间复杂度 $O(1)$。

#include<bits/stdc++.h>
using namespace std;
int n,k;
void solution(){
    scanf("%d%d",&n,&k);
    if(n==1) puts("1\n1");
    else if(k==1||k==n) puts("-1");
    else if(k&1) printf("5\n1 2 %d %d %d\n",k,k+1,n);
    else printf("3\n1 %d %d\n",k,k+1);
}
int T;
int main(){
    scanf("%d",&T);
    while(T--) solution();
    return 0;
}
最后修改:2024 年 11 月 11 日
如果觉得我的文章对你有用,请随意赞赏