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

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

原文地址:https://www.cnblogs.com/dandi/p/4038343.html