1038. Recover the Smallest Number (30)好题
2015-08-28 09:57
260 查看
1038. Recover the Smallest Number (30)
时间限制400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
Given a collection of number segments, you are supposed to recover the smallest number from them. For example, given {32, 321, 3214, 0229, 87}, we can recover many numbers such like 32-321-3214-0229-87 or 0229-32-87-321-3214 with respect to different orders
of combinations of these segments, and the smallest number is 0229-321-3214-32-87.
Input Specification:
Each input file contains one test case. Each case gives a positive integer N (<=10000) followed by N number segments. Each segment contains a non-negative integer of no more than 8 digits. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the smallest number in one line. Do not output leading zeros.
Sample Input:
5 32 321 3214 0229 87
Sample Output:
22932132143287
最好和这道题一起看,觉得挺有意思UVA
- 11729 Commando War
一道看起来很简单,写起来有点痛苦,最后解法比较有趣的题目。据说是一道面试题的改编。
题目给你一些数字的片段(number segments),所以应当用string存储而不是int,希望拼接之后能拼出的最小的数字,这是一道很神奇的题目,我分类讨论分了很多,最后突然发现它的最终解法无比简洁。
其实就是一个序的关系,所有的组合有n!种,(像"所谓组出最小数其实是获得字典序最小的拼接方式"这种废话我就不说了)。假设我们获得了其中的一个组合,然后又两个相邻的数字片段a,b。然后我们就要想,把a和b交换能不能使整个序列变小呢?这个问题的其实等价于b+a 是否小于a+b(此处"+"为连接符),也就是说对于这样一个序列,如果某两个相邻的元素之间发生交换可以使得整个序列的值变小,我们就应该坚决的交换啊,所以这里定义一个新的序,用<<来表示,若a+b
< b + a 则a应当在b前面,即a << b。然后呢,这种序是满足传递性的若a<<b ,b << c,则a<<c,所以迭代到最后,我们就会获得一个任何两个相邻元素都不能交换的局面,也就是所谓的答案。
这样一来我们的算法就有了,比较每两个相邻的元素,如果交换可以使得整个序列变大,就交换之,直到最后没有任何两个值之间能进行交换,啊,这不就是传说中的Bubble_Sort吗,真是一个令人激动的结论啊。对序列按照之前定义的序进行排序,如此就好了。
# include <cstdio> # include <iostream> # include <string> using namespace std; const int _size = 10000; string num[_size]; bool cmp(const string& a,const string& b){return a + b< b + a;} int main() { int n,i; cin >> n; for (i=0;i<n;i++) cin >> num[i]; sort(num,num+n,cmp); string out; for (i=0;i<n;i++) out += num[i]; for (i=0;i<out.size()&&out[i]=='0';i++); if (i==out.size()) printf("0"); else printf("%s",out.c_str()+i); printf("\n"); return 0; }
相关文章推荐
- codevs 1690 线段树
- 剑指offer——面试题31:连续子数组的最大和
- ASP.NET 常用内置对象详解-----Response
- php安装扩展
- java.lang.IllegalStateException: Target host must not be null, or set in parameters. scheme=null, ho
- (转)浅谈SPI总线
- PrimeFace JSF中使用ajax控件无法实时更新文本框inputTextarea内容
- iOS开发之多线程
- Tips
- Android Studio导入项目的几种方法
- javamail发送邮件的简单实例
- 算法研究之合并两个已排序的数组java版
- Struts2拦截器配置
- java.lang.IllegalStateException: attempt to re-open an already-closed object
- 虚拟机Linux系统修复_偏方
- php 变量
- 使用zlib实现gzip格式数据的压缩和解压
- Android ADB命令大全
- 挑战假设,尤其是你自己的
- LeetCode Sliding Window Maximum