【题解】P1286 两数之和
题目大意
众所周知,从\(n\)个非负整数中任取两个相加共有\(\frac{n\times (n-1)}{2}\)个和。现在给出这\(\frac{n\times (n-1)}{2}\)个和值,要求\(n\)个非负整数。若答案不存在,输出“impossible
”。
\(n \le 10\),给出的数\(\le10^5\)
分析
设第\(i\)个非负整数为\(a_i\),不妨设\(a_1\le a_2\le ...\le a_n\)。我们将\(\frac{n\times (n-1)}{2}\)个和写成如下形式:
\[ \begin{aligned} a_1+a_2~~a_1+a_3~~a_1+a_4~~a_1+a_5~~a_1+a_6~~&...~~a_1+a_n \\ a_2+a_3~~a_2+a_4~~a_2+a_5~~a_2+a_6~~&...~~a_2+a_n\\ a_3+a_4~~a_3+a_5~~a_3+a_6~~&...~~a_3+a_n\\ a_4+a_5~~a_4+a_6~~&...~~a_4+a_n\\ a_5+a_6~~&...~~a_5+a_n\\ ~~&...~~\\ &~~a_{n-1}+a_n \end{aligned} \] 在同一行内,值从左到右递增;在同一列内,值从上到下递增。显然,左上角的值就是所有和里的最小值。若\(a_1\)已知,我们可以找到最小值,求出\(a_2\);之后把这一列的元素删光,再次求最小值(此时是\(a_1+a_3\)),求出\(a_3\),并删光这一列的元素,再找最小值(此时是\(a_1+a_4\))……这样可以推出\(a_1\to a_n\)所有值。
如何求\(a_1\)的值?考虑最小值就是\(a_1+a_2\),且\(a_1\le a_2\), 从\(0\to\)最小值的\(\frac{1}{2}\)枚举即可。如果给出的集合中值没有枚举的\(a_1\)推出来的值,那么枚举的值是不合法的。
要快速删除数列的元素、求最小值、判断元素存不存在,使用\(\text{multiset}\)实现。
实现
1 |
|