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

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

  • 相关阅读:
    [Hadoop]
    [Linux]
    [Linux]
    [Hadoop]
    [Hadoop]
    vue-学习笔记-API-全局配置
    vue 风格指南-必须的
    vue 学习笔记-复用-自定义指令
    vue学习笔记-过滤器
    vue 学习笔记-复用-对象混入
  • 原文地址:https://www.cnblogs.com/dandi/p/4038343.html
Copyright © 2011-2022 走看看