首页 > 试题广场 >

星际舰队的补给分配

[编程题]星际舰队的补给分配
  • 热度指数:231 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在遥远的未来,人类已经进入了广阔的星际时代。一支名为“远征号”的星际舰队正在未知的宇宙深处执行探索任务。舰队由多艘补给舰和作战舰组成。补给舰负责从资源星开采并运送能量晶体,而作战舰则需要消耗这些晶体来维持护盾和武器系统。

每天,都会有一批补給舰(记作集合 C)满载能量晶体返回母舰基地,它们需要排队进入唯一的能量接口进行卸货。同时,多艘作战舰(记作集合 G)也在排队等待能量补充。补给总指挥官,一位久经沙场的将军,制定了一套高效的能量分配规则,以确保舰队的战斗力。


假设当前排在补给队列第一位的补给舰运来的能量晶体数量为 K。作战舰的需求队列中,排在第 j 位的作战舰记为 G_j,其能量需求为 d_j

将军制定的分配规则如下:

1. **精准匹配**:如果当前补给舰的能量 K 正好等于队首作战舰 G_1 的需求 d_1(即 K = d_1),则该补给舰的能量将完全转移给 G_1。完成补给后,这艘补给舰和作战舰 G_1 均离开各自的队列。

2. **超量分配**:如果当前补给舰的能量 K 大于队首作战舰 G_1 的需求 d_1(即 K > d_1),则启动连续补给模式。系统会寻找一个最大的整数 i \ge 1,使得队列前 i 艘作战舰的总需求满足:
\sum_{j=1}^{i} d_j \le K 并且 \sum_{j=1}^{i+1} d_j > K

此时,该补给舰的全部能量 K 将被分配给这 i 艘作战舰(G_1, G_2, \dots, G_i)。这些作战舰完成补给后离开队列,同时该补给舰也离开队列。下一轮分配将由下一艘补给舰和新的队首作战舰 G_{i+1} 开始。

3. **需求不足**:如果当前补给舰的能量 K 小于队首作战舰 G_1 的需求 d_1(即 K < d_1),则 G_1 无法在此轮得到满足。G_1 将放弃本次补给机会,移动到作战舰队列的末尾重新排队。该补给舰则继续等待,尝试为下一艘作战舰(原队列中的 G_2)进行补给。

在所有补给舰的能量晶体分配完毕,或者所有作战舰都完成补给后,流程结束。请计算,最终有多少艘作战舰未能成功获得能量补充?

输入描述:
输入包含两行,均为一系列由空格分隔的正整数。

- 第一行代表补给舰队列 C 中各舰船的能量晶体数量。数组中的第 i 个元素 c_i 代表第 i 艘补给舰的载量。我们保证 1 \le i \le 10001 \le c_i \le 100
- 第二行代表作战舰队列 G 中各舰船的能量需求。数组中的第 j 个元素 d_j 代表第 j 艘作战舰的需求量。我们保证 1 \le j \le 10001 \le d_j \le 100

若输入格式不合法(例如,行为空或数值越界),程序应返回 `-1`。


输出描述:
输出一个整数,表示在分配流程结束后,未能获得能量补充的作战舰的数量。
示例1

输入

1
5 6

输出

2

说明

补给舰的能量 K=1 无法满足任何一艘作战舰的需求(需求分别为 56)。
因此,两艘作战舰都未能获得补给。
示例2

输入

3 5 7 3 4
2 4 8 5 2

输出

1

说明

1.  第一艘补给舰,能量 K=3。队首作战舰需求 d_1=23 > 2,启动超量分配。
- \sum_{j=1}^{1} d_j = 2 \le 3
- \sum_{j=1}^{2} d_j = 2+4 = 6 > 3
- 因此,能量分配给第一艘作战舰。补给舰队列变为 `5 7 3 4`,作战舰队列变为 `4 8 5 2`。

2. 第二艘补给舰,能量 K=5。队首作战舰需求 d_1=45 > 4,启动超量分配。
- \sum_{j=1}^{1} d_j = 4 \le 5
- \sum_{j=1}^{2} d_j = 4+8 = 12 > 5
- 能量分配给第一艘作战舰。补给舰队列变为 `7 3 4`,作战舰队列变为 `8 5 2`。

3. 第三艘补给舰,能量 K=7。队首作战舰需求 d_1=87 < 8,需求不足。
- 需求为 8 的作战舰移动到队尾。作战舰队列变为 `5 2 8`。补给舰 `7` 继续尝试。

4. 补给舰 `7` 继续。队首作战舰需求变为 d_1=57 > 5,启动超量分配。
- \sum_{j=1}^{2} d_j = 5+2 = 7 \le 7
- \sum_{j=1}^{3} d_j = 5+2+8 = 15 > 7
- 能量分配给前两艘作战舰。补给舰队列变为 `3 4`,作战舰队列变为 `8`。

5. 此后,剩余的补给舰能量(34)均无法满足需求为 8 的作战舰。
最终,只有一艘需求为 8 的作战舰未能获得补给。
示例3

输入

3 5 7 9 3 2 1
1 2 4 5 2

输出

0

说明

按照分配规则,所有作战舰最终都能获得所需的能量。

备注:
本题由牛友@Charles 整理上传
from collections import deque

supply = deque(map(int, input().split()))
request = deque(map(int, input().split()))
num_requests = len(request)

if len(supply) == 0&nbs***bsp;len(request) == 0:
    print(-1)
    exit()

less_than_depth = 0
count = 0

while supply and request:
    if supply[0] < request[0]:
        if less_than_depth >= len(request):
            less_than_depth = 0
            supply.popleft()
        else:
            less_than_depth += 1
            request.append(request.popleft())
    
    elif supply[0] > request[0]:
        less_than_depth = 0
        if len(request) > 1 and supply[0] - request[0] >= request[1]:
            supply[0] -= request[0]
            request.popleft()
            count += 1
        else:
            supply.popleft()
            request.popleft()
            count += 1
    
    else:
        less_than_depth = 0
        supply.popleft()
        request.popleft()
        count += 1

print(num_requests - count)

发表于 2025-09-10 13:56:00 回复(0)