蓝桥杯 双向排序 【超时70分】

又是一瓶奶,一道题,一写就是一小时。。。。思路蛮快的,链表删除反倒是出错看了半天我去。

我的思路:

我们不能一个一个机械地按照指令对数组进行排序操作。我们需要对操作序列预先处理,减少复杂度。由于处理过程需要进行增、删、遍历操作,我选择了链表作为数据结构。【不知道有没有更好的数据结构?】

首先说明一个命题:

操作为0是从前面降序,操作为1是从后面升序。假设操作0 m和1 n两次,则这俩操作区域在数组的示意图如下,阴影表示操作区域,要么:

|/m____n\\\\\\\\\\|

要么:

|nXXXm\\\\\\\|

第二种即有所交叉。

由于mn一个升序,一个降序,所以不管是先做m操作还是先做n操作,交叉的n___m段序列都一样。

以此为基础。

建立一个存储操作序列的链表。

typedef struct Link{
	Link* next;
	int p;
	int q;
}Link;
typedef Link* List;

考虑操作数为0,操作下标假设为x。如果在已知的操作序列中,存在操作数为0、操作下标为y(y<x),我们认为0 x操作覆盖了0 y操作,将0 y从操作序列中删除。

此处覆盖指的是操作范围覆盖:

|XXXXXXy\\\\\\\\x________|

<
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值