POJ 2718:Smallest Difference(dfs)
2016-05-07 11:23
288 查看
原题地址:点击打开链接
(原题是英文,下面的是用有道翻译的)描述
鉴于许多不同的小数位数,你可以通过选择一个非空的子集形成一个整数的位数和写一些秩序。剩下的数字可以写在一些秩序形成第二个整数。除非得到的整数是0,整数可能不会从数字0开始。
例如,如果您有数字0,1,2,4,6和7,您可以编写两个整数10和2467。当然,有很多方法可以形成这样的双整数:210年和764年,204年和176年,等。整数之间的差异的绝对值在过去的28岁,事实证明,没有其他一对由上面的规则可以实现一个更小的差异。
(题意就是说给几个数字(从0到9且不会重复),用这几个数字组成两个数,使他们差的绝对值最小
比如给0,1,2,4,6,7,那么构成204和176差最小,是28,而构成276,140就不是最小的了)
输入
输入的第一行包含病例数。对于每个案例中,都有一行输入包含至少两个但不超过10个小数位数。(小数位数0,1,……9)。没有数字不止一次出现在一行的输入。数字将出现在增加订单,由一个空格隔开。
输出
对于每个测试用例,写在一行两个整数的最小绝对差,可以从给定的数字写如上所描述的规则。
时间限制: 1000 ms
内存限制: 65536 k
Sample Input
1
0 1 2 4 6 7
Sample Out
28
#include <iostream> #include <algorithm> #include <cctype> #include <cstdio> #define MAX_N 10 using namespace std; int a[MAX_N], n, ans; int ArrayNum(int l, int r) { int num = 0; for(int i = l; i < r; i ++) num = num*10 + a[i]; return num; } void solve() { ans = 1E10; do{ int m = n / 2; if(!a[0] && m > 1) continue; if(!a[m] && n - m > 1) continue; ans = min(ans, abs(ArrayNum(0, m) - ArrayNum(m, n))); }while(next_permutation(a, a + n)); cout << ans << endl; } int main() { int M; cin >> M; getchar(); //忽略'\n' while(M --){ char ch; n = 0; while((ch = getchar()) != EOF){ if('\n' == ch) break; else if(isdigit(ch)) a[n ++] = ch - '0'; } solve(); } return 0; }
Dfs暴力加筛选,因为最多只有10! = 362 8800次,足够用了
这道题之前还以为输入的第一行是数字个数的,结果就WA了很多次。。
相关文章推荐
- ICON小图标
- 【OpenCV】特征检测器 FeatureDetector
- JS计算字符串的长度
- javascript:void(0)与return false的区别
- 深入解析Backbone.js框架的依赖库Underscore.js的作用
- 大公司里怎样开发和部署前端代码
- js--面向对象--构造函数的继承
- 前端招聘必看!总结的太好了
- 前端开发介绍(包含调试什么的)
- 使用clipboard.js复制页面内容到剪切板
- Manifest文件详解
- 【jQuery】关于jQuery中$(function() {});
- 用html5新增的js媒体 API手写的一个视频播放器
- 百度地图API之JavaScript 开源库1
- JavaScript的Backbone.js框架入门学习指引
- js实现网页图片轮换播放
- 保存 framebuffer内容到BMP文件
- 我们平时是怎么写html和css的?
- bzoj 1610: [Usaco2008 Feb]Line连线游戏(计算几何)
- SharedPreferences保存用户偏好参数