C - Sowing Stones(python解)-atcoder

C - Sowing Stones** (python解)-atcoder

原题链接:

C - Sowing Stones

问题分析:

每个包含石头的单元格 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 个石头,我们可以将多余的石头向右移动,直到耗尽该单元格的石头或填满下一个单元格。
  • 我们需要跟踪确保每个单元格从 1N 最终都有 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)
posted @ 2024-11-10 15:54  MPyGF  阅读(25)  评论(0编辑  收藏  举报