使用一组特定的规则将数组元素归零?

时间:2013-02-11 17:27:33

标签: algorithm

给定n个数字,您可以执行以下操作任意次:选择数字的任何子集,其中没有一个是0.将子集中的数字减1,并将子集中的数字增加K

是否可以执行操作,使除了其中一个之外的所有数字都变为0?

输入: 第一行包含测试用例数量T. 2 * T行跟随,每种情况2。测试用例的第一行包含数字n和K.下一行包含n个数字,a_1 ... a_n。

输出: 输出T线,一个对应于每个测试用例。对于测试用例,如果存在所描述的操作序列则输出“是”,否则输出“否”。

示例输入:

3
2 1
10 10
3 2
1 2 2
3 2
1 2 3

示例输出:

YES
YES
NO

约束:

1 <= T <= 1000
2 <= n <= 100
1 <= K <= 10
0 <= a_i <= 1000

我已经通过以下算法接受了我的解决方案---

a[i] is value in ith cell
n[i] is number of times it is selected in subset
T is total number of times the operation is done

=> a[i] - n[i] + (T - n[i])*K = 0 for all except 1
=> a[i]= n[i] (K+1) -TK 
=> a[i] = (K+1)(n[i]-T) + T

因此除了1(将变为零)之外的所有a [i]的余数应该相同,并且当除以K + 1时,T应该是相同的。我怀疑这种情况是否必要,但这又如何呢?

1 个答案:

答案 0 :(得分:1)

第1步

想象一下这一举动包括:

  1. 选择由a [i]> = K + 1
  2. 的所有数字组成的子集A.
  3. 选择包含整套K次的子集
  4. 子集A中的数字将减少K + 1次,而集合A外的数字将保持不变(增加K,然后减少K次)。

    重复此移动,直到所有数字都小于K + 1.

    此步骤将更改数字,使其成为模数K + 1的残差。

    第2步

    现在假设所有数字都相同(1除外)。

    我们现在可以选择一个由整个集合组成的子集(奇数除外)。

    这会将所有数字减少1(奇数除外)。重复此选择,直到我们一直减少到0。

    结论

    因此,如果所有数字(除了一个)具有相同的残差模K + 1,我们可以使用步骤1将它们全部减少到相同的水平,然后步骤2将公共水平降低到0。