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,等等,这种情况,就全部枚举一下。

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

  • 相关阅读:
    PHP中判断变量为空的几种方法小结
    linux mysql字符编码问题
    php连接access数据库的三种方法
    js 一个关于图片onload加载的事
    shell脚本修复MySQL主从同步
    【Median of Two Sorted Arrays】cpp
    【Search In Rotated Sorted Array】cpp
    【Remove Duplicates from Sorted Array II】cpp
    【Remove Duplicates from Sorted Array】cpp
    Python刷题到底为止-开始cpp刷题
  • 原文地址:https://www.cnblogs.com/dandi/p/4038343.html
Copyright © 2011-2022 走看看