Description
我们知道从\(n\)个非负整数中任取两个相加共有\(n*(n-1)/2\)个和,现在已知这\(n*(n-1)/2\)个和的值,要求这\(n\)个非负整数。(多组数据,\(2<{n}<10\))。
Solution
很妙的思路呀。。考试的时候已经接近正解了,但还是没想出来
我们设这\(n\)个原来的数分别为\(a,b,c,...\),且\(a<b<c<...\)
这\(n\)个数两两相加,最小的两个数肯定是\(a+b\)和\(a+c\)。然后我们再枚举\(b+c\)(最多只有\(n\)种可能),就可以把\(a,b,c\)都算出来。
我们再把\(a+b,b+c,c+a\)都删掉,剩下的最小的一定就是\(a+d\)。从而算出\(d\)。再用算出的\(d\)把\(a+d,b+d,c+d\)都删掉。
重复这种操作,如果最后\(n*(n-1)/2\)个数恰好都被删掉,则这是一种合法情况,否则就继续枚举\(b+c\)。
这样的复杂度是\(O(n^3log(n))\)的。
Tips
这样做复杂度比较高,要加一些优化。
首先是如果运算过程中,有某个原数的值\(<0\),则肯定不合法。
然后注意判断\((a+b)+(b+c)+(c+a)\)一定为偶数。
删掉序列中某个特定的值可以用\(multiset\)(还可以排序)。