L2-014 列车调度 (25 分)

这篇博客探讨了一种处理数字序列的策略,通过创建队列并遵循最小合法解原则进行排序。文章中详细解释了如何根据输入数据动态创建和更新队列,并使用`upper_bound`函数找到合适的位置插入元素,确保队列最后的元素按递增顺序排列。代码实现中涉及到了C++的数据结构和算法应用。

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

很有意思和新意的题目
我们上来肯定是一脸懵逼的,所以我们从一个简单的case开始。如测试数据:
9
8 4 2 5 3 9 1 6 7
8肯定是先来的,我们开通第一个队列:
8
然后4来了,我们可以使用上一个队列:
8 -> 4
然后是2,同理:
8 -> 4 -> 2
然后是5,注意,我们不得不开第二队列:8 -》4
8 -> 4 -> 2
5
然后是3
8-> 4 -> 2
5-> 3
然后是9,不得不开一个新的
8 ->4 -> 2
5-> 3
9
下一个是1,最优的解显然是在2后面(*原则:选择最小的合法解)
8 ->4 -> 2 -> 1
5-> 3
9
然后是6,根据原则
8 ->4 -> 2 -> 1
5-> 3
9-> 6
然后是7,不得不开一个队列
8 ->4 -> 2 -> 1
5-> 3
9-> 6
7

注意到,按照原则这样去排,各个队列最后一辆车是递增顺序。由数据规模,可以2分。又必须前一辆车大于后一辆车,那么考虑upper_bound,考虑到upper_bound可能越界,所以最后一个数我们填上一个巨大的数如0x3f3f3f3f。

#include "cstdio"
#include "algorithm"
using namespace std;
int que[100000];
int siz = 0;
int find(int val){
	int p = -1;
	int *pos = upper_bound(que, que + siz, val);
	if(*pos != 0x3f3f3f3f) p = pos - que;
	return p;
}
int main(){
	int n;
	que[siz] = 0x3f3f3f3f;
	scanf("%d", &n);
	for(int i = 0; i <n; ++i){
		int temp;
		scanf("%d", &temp);
		int pos = find(temp);
		if(pos == -1){
			que[siz++] = temp;
			que[siz] = 0x3f3f3f3f;
		}
		else que[pos] = temp;
	}
	printf("%d", siz);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值