zoukankan      html  css  js  c++  java
  • Poj 2718 Smallest Difference

    题意:

      给定N个数字,0..9不重复,求由他们组成的两个数字的最小差。

      比如给定0 1 2 4 6 7,那么分别构成204和176,差最小。

      注:构成的数字0不可以作为首位,除非这个数字就是0.

    解析:

      1.DFS

        最裸的算法自然是分别枚举,全排列,但是这样时间效率不是十分好。

        优化:

          首先,假如两个构成数字的位数差别高于等于2的话,显然会有更优答案。

          所以这样限定了两个数字的位数,必定为n/2,n为奇数的话选一个为n/2+1就可以了。

          其次,假如枚举一个数为大数,另外一个为小数,当目前构造小数的时候假如把后面所有位都补为9也比已经得到的答案大的情况下,就不必继续枚举了。——这个剪枝没写太好...

          枚举所有集合状态的时候,可以用s = 1 to (1<<n) -1代表每个数字分到的集合,选择相差<2的,进行next_permutation

      2.贪心构造

        首先分情况,如果是偶数个,那么选择两个相差最小的数字作为首位(不可以含有0,除非n=2),剩下的数字中,构造出一个最大的数字加到较小头的末尾,小的加到较大的头的末尾。——注意,如果有多组数满足相差最小,比如3,4,5,6,7——可以选择3,4 也可以选择4,5,等等,这种情况,就全部枚举一下。

        如果是奇数个,那么选择一个最小的数字当做头,剩下的构造最大数为较小数,构造最小数加到较大数尾部。 

  • 相关阅读:
    Lambda表达式效率问题
    设计模式之代理模式
    spring学习之AOP
    jq 中input为radio设置选中状态,attr问题
    css 清除float浮动方法整理
    jquery.ready可以在文档加载后尽快执行对文档的操作
    前端学习网址整理
    图片缓存未触发onload
    spring mvc 下,ajax调用后台controller方法时报415 (Unsupported Media Type)错误
    nodejs向前台send数据时Date类型数据格式问题
  • 原文地址:https://www.cnblogs.com/dandi/p/4038343.html
Copyright © 2011-2022 走看看