1204. 最后一个能进入电梯的人

写一条 SQL 查询语句查找最后一个能进入电梯且不超过重量限制的 person_name


这条题目就是考察累加,然后找到最后一个人。

SELECT person_name
FROM Queue AS q1
WHERE 
(
    SELECT SUM(weight) 
    FROM Queue 
    WHERE turn <= q1.turn
) <= 1000
ORDER BY turn DESC
LIMIT 1

找到累加和小于等于1000的最后那个人,外面的语句很好理解。
里面的语句是来求对每个人 累加它本身及之前的人的体重。

要解决这个问题,我们可以使用贪心算法或优先队列(如二叉堆)来优化处理。我们需要确保每次都是最快的那个先走,直到所有都到达他们的目标楼层。同时,我们要跟踪两个电梯的状态,一个上升,另一个下降。 以下是一个简单的解决方案: 1. 初始化两个变量 `up` 和 `down` 分别表示当前上升的电梯和下降的电梯; 2. 创建一个包含所有的数组 `arr`,其中 `arr[i] = [a[i], i]` 表示第i个的到达时间和编号; 3. 对于每个,按照到达时间排序数组; 4. 遍历排序后的数组,当遇到到达时间大于当前电梯所在楼层的时,选择到达时间最近的进入电梯; 5. 当所有到达后,两个电梯都要从最后一个到达楼层返回到一楼,所以在这个过程中也要计算时间; 6. 最后累加所有时间得到总时间。 下面是伪代码形式的解决方案: ```c #include <stdio.h> #include <stdlib.h> int main() { int n, a[100]; // 假设最多100 scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d", &a[i]); } // 排序 for (int i = 0; i < n - 1; ++i) { for (int j = 0; j < n - 1 - i; ++j) { if (a[j][0] > a[j + 1][0]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } int up_time = 0, down_time = 0, total_time = 0; // 让每个都坐电梯 for (int i = 0; i < n; ++i) { int current_floor = a[i][1] + 1; // 上升电梯 // 更新上升电梯的时间 up_time += a[i][0]; // 如果电梯满,则等待下一个 while (up_time > down_time) { down_time += a[i][0]; // 下降电梯返回一楼 up_time = max(up_time, down_time); // 等待下一个到达 } // 记录电梯回到一楼的时间 if (current_floor == 1) { total_time += up_time; // 只有一部电梯,另一部也一起回到一楼 } else { total_time += up_time + down_time; // 到达目标楼层后,两部电梯都要回一楼 } } printf("总时间为 %d\n", total_time); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值