我为该任务编写了代码:
Дан массив a длины n, вы можете сделать не более k
операций следующего типа: выбрать 2
различных элемента в массиве, прибавить 1
к первому и вычесть 1 из второго.
После применения операции все элемента a
должны остаться неотрицательными.
Какой лексикографически минимальный массив можно
получить? Массив xлексикографически меньше чем
массив y, если есть индекс i такой, что
xi<yi, и xj=yjдля всех 1≤j<i. Проще говоря,
для первого такого i, где массивы различны, xi<yi.
Входные данные
В первой строке записано одно целое число
t (1≤t≤20) – количество наборов входных данных.
В первой строке каждого набора входных
данных записаны 2целых числа n и k
(2≤n≤100, 1≤k≤10000) — размер массива
и максимальное количество операций.
Во второй строке каждого набора входных
данных записаны n целых чисел a1, a2, …, an
(0≤ai≤100) — элементы массива a.
Выходные данные
На каждый набор входных данных выведите
лексикографически минимальный массив, который
может получиться из исходного за не более чем k
операций.
Пример
входные данные
2
3 1
3 1 4
2 10
1 0
выходные данные
2 1 5
0 1
但在一些测试中它给出了错误的答案,我的代码是:
n=int(input())
for i in range(n):
a, b=map(int, input().split())
s=list(map(int, input().split()))
if s.count(0)==a-1:
print("0 "*(a-1), end="")
print(max(s))
else:
x=0
y=a-1
while s[x]>0 and s[y]>0 and b>0 and s.count(0)<a-1:
s[x]-=1
s[y]+=1
b-=1
if s[x]==0:
x+=1
if s[y]==0:
y-=1
print(*s)
我不知道该怎么办,请帮忙修改和完善代码!
您的代码中的主要思想是正确的:将它们尽可能移到左侧并将它们移到尽可能右侧。但也有错误:
数组测试
1 1 0使其保持不变。虽然还有一个更小的答案——0 0 2。原因是条件s[y]>0。这是多余的,而且只会造成妨碍。如果数组的最后一个元素为零,为什么我们拒绝将其放在那里?我们删除这个条件。数组测试
0 1 0 1使其保持不变。虽然较小的答案是0 0 0 2. 原因是条件s[x]>0。由于当前位置为零而中断循环是错误的。零右侧可能还有仍可处理的数字。但s[x]不知何故需要处理零。让我们在循环中添加一个条件:条件
if s[y]==0:永远不会满足。s[y]或者已经大于零或者刚刚收到一个额外的值。我们将其删除。这种情况
if s[x]==0:曾经有用并且仍然有用。但循环体的开头已经存在类似的条件。我们删除它:该条件
s.count(0)<a-1很有用,但可以用更简单的条件代替 -x < y。当x较少时,y您可以继续尝试转移单位,否则必须停止循环。另一个原因是新条件被认为更快。if s.count(0)==a-1:它在程序开始时起什么作用?它优化了数组几乎全部为零时的情况。有必要吗?不,你可以不用它。程序会变得更慢(但仅在特殊情况下)并且更简单。删除:最新版本开始正常工作。她更容易。但这并不是停止的理由。
min(s[x], b)立即转移单位。事实证明,循环内的条件是不需要的:b>0不再需要这个条件了。它使程序更快一点,但也更复杂。如果它被删除,循环while可以替换为for ... range:1. 您需要对代码进行更改,使其符合问题中描述的输入和输出格式。为此,您需要将行“n=int(input())”更改为“t=int(input())”以读取输入的数量。然后您必须对结果的输出进行更改。
2. 在 while 循环中,检查条件的顺序错误。首先,您必须检查数组中是否有零个元素,然后递减 b。
3. 当 s.count(0) 等于 a-1 时,您的代码不满足问题的条件。在这种情况下,您应该将整个数组输出为 0。
下面是更正后的代码,考虑到了所描述的更改: