zoukankan      html  css  js  c++  java
  • [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\)(还可以排序)。

  • 相关阅读:
    ubuntu查看软件安装位置
    es search
    es
    Elasticsearch 之python
    用户登陆注册,修改密码
    Django基础—— 9.ORM机制讲解
    Django基础—— 8.数据库配置
    Django基础—— 7.View函数(2)
    Django基础—— 7.View函数(1)
    Django基础—— 6、URL分发器
  • 原文地址:https://www.cnblogs.com/andysj/p/13831979.html
Copyright © 2011-2022 走看看