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

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

  • 相关阅读:
    HTML_严格模式与混杂模式
    不要和一种编程语言厮守终生:为工作正确选择(转)
    iOS开发编码建议与编程经验(转)
    UTF-8 和 GBK 的 NSString 相互转化的方法
    UICollectionView 总结
    UIViewController的生命周期及iOS程序执行顺序
    objective-c 中随机数的用法
    clipsToBounds 与 masksToBounds 的区别与联系
    网络请求 代码 系统自带类源码
    iOS CGRectGetMaxX/Y 使用
  • 原文地址:https://www.cnblogs.com/dandi/p/4038343.html
Copyright © 2011-2022 走看看