uv-1084,uva11059

  uv-1084,uva11059

  标题链接:

  http://uva.onlinejudge.org/index.php?option=com _ online judge Itemid=8 category=457 page=show _ problem problem=1258

  1.先把方程的项移动一下,假设原来的项是1 ^ 2=4-5 ^ 6,那么移动后就变成了1 ^ 2-4 ^ 5 ^ 6=0。并计算所有数字的和,sum,以及等式左边的正数plusNum。

  2.然后演变成“从N个数中选出sum/2之和的plusNum个数组成一个正部”,因为如果等式成立,那么所有正数之和的绝对值和所有负数之和的绝对值一定相等。如果为真,对于每一个数,要么取,要么不取,复杂度就变成了2 ^ 16。

  3.分支剪枝:1)如果每次递归中当前值加上要选择的数之和大于sum/2,则不选择。

  2)如果所有数的和都是奇数,那么直接无解。这个优化挺大的,直接从1.9s降到了0.08s然而我真的不知道Orz是怎么从rank No.1神牛的0.02s中走出来的。

  #包括cstdio

  #包括cstring

  const int maxn=1000

  char str[10000];

  char sigma[maxn];

  bool vis[maxn];

  int num[maxn],ans[maxn],n,idx

  int加[maxn],leftNum,plusNum,sum

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: