[Luogu]P1286 两数之和

\(Link\)

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\)(还可以排序)。

posted @ 2020-10-17 17:38  andysj  阅读(175)  评论(0编辑  收藏  举报