2022年江西省赛D题题解

本文主要解析2022年江西省大学生程序设计竞赛D题,重点在于数据结构的运用,特别是单调栈在解决题目中关键问题的角色。题目分为两种情况讨论,一是k * p < n,二是k * p >= n。在第一种情况下,通过单调栈保持递减序列,并利用i - top <= k * p的条件决定何时停止维护单调性。在第二种情况的处理上相对直接。代码实现中包含了对删除元素的后续操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门:D-Remove and append_2022年江西省大学生程序设计竞赛(正式赛) (nowcoder.com)

该题主要考数据结构的熟练程度,对单调栈的理解能力

步入正题

这题主要分两种情况

  1. k * p < n 的情况
  2. k * p >= n 的情况

对于第一种情况我们来考虑原数组一定会有 n - k * p 个留下, 此时我们就来考虑如何留下这 n - k * p个数我们得到的答案才是最佳

我们对原数组用单调栈处理,枚举时用 i - top <= k * p 来判断出栈的元素是否以及超过了我们需要处理的数目,未超过继续用单调栈维护递减序列,超过则表示不可在删数

while(top && a[i] > a[b[top]] && i - top <= k * p) top --;
		b[++ top] = i;

简单说明:我们需要的是字典序最大的序列,所以我们需要用单调栈维护一个单调递减序列,但是维护的同时我们得保证前面被删的数不超过 k * p,相等了就不需要再维护单调递减,直接把后面数全部压栈,如何保留前 n - k * p 个; 

while(n - top < k * p) top --;

剩下的就是对删除

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值