C - Sowing Stones(python解)-atcoder
C - Sowing Stones** (python解)-atcoder
原题链接:
问题分析:
每个包含石头的单元格 X[i] 中有 A[i] 个石头。
我们需要确保每个单元格从 1 到 N 最终都有 1 个石头。
思路:
- 可用的石头总数必须等于单元格的总数。即需要
N
个石头,但只有ΣA[i]
(其中A[i]
是单元格X[i]
中的石头数量)个石头。如果ΣA[i]
小于N
,则无法满足条件,输出-1
。 - 如果
ΣA[i]
大于N
,则我们有多余的石头,需要正确分配。 - 我们只能将石头从单元格
i
移动到单元格i+1
。因此,如果某个单元格有超过1
个石头,我们可以将多余的石头向右移动,直到耗尽该单元格的石头或填满下一个单元格。 - 我们需要跟踪确保每个单元格从
1
到N
最终都有1
个石头所需的操作(石头移动)次数。
代码:
N,M = map(int, input().split())
X = list(map(int, input().split()))
A = list(map(int, input().split()))
if sum(A) != N:# 检查所有石头的总数是否等于单元格的数量 N
print(-1)
exit()
num, ans = 0, N * (N + 1) // 2# 初始化 ans 为 N*(N+1)//2,表示理想情况下每个单元格都有 1 个石头的总移动成本
for x, a in sorted(zip(X, A), key=lambda x: x[0]):
# 如果当前可用的石头数量小于目标位置 x 前的单元格数量
if num < x - 1:
ans = -1
break
num += a
ans -= x * a
print(ans)