作者:相对论! | 来源:互联网 | 2023-10-16 10:46
本文由编程笔记#小编为大家整理,主要介绍了题解 P1286 两数之和相关的知识,希望对你有一定的参考价值。
提供一个新思路
这题,我们假设n个数分别为a1,a2,a3,a4,a5...an,且对于任意
1<=i而他们两两之和即为输入的各数字,从中,我们不难推出对于输入的数字中(我们把它们按从小到大排序,分别设为m1,m2...)
一定满足:m1=a1+a2,m2=a1+a3(我们可以用反证法证明结论)
但m3有两种情况:m3=a1+a4或者m3=a2+a3,我们无法判断,那么,
为什么我们不能把a2+a3的情况排除呢?
所以我们可以这样做: 同样枚举a1(1->m1/2),然后算出a2,a3。这时,我们对a2+a3的数字打个标记,当下次访问到的时候将标记取消说明剩下的数字不是a2+a3,那么,剩下的数的最小的那一个一定是a1+a4!同理我们对a2+a4,a3+a4打标记。。。 最后就能求出所有的a了,如果我们求完了n个数,然而,还有数没被打上标记,就说明此时的a1时错误的我们需要重新枚举。
最后,我们就可以求出答案了~
代码:
#pragma GCC optimize(3)