POJ 2718 Smallest Difference(dfs 全排列)
2016-03-30 18:29
483 查看
http://poj.org/problem?id=2718
这道题就把所有给出的数全排列,然后把数字划分为数量靠近的两堆,数量要么都一样,要么后面一堆比前面一堆少一个,然后两堆中的数字按照顺序组成数,绝对值不断更新最小值。要让difference最小,那么一定是数字划分成两堆的时候数量也要靠近。这样划分方法加上全排列,可以确保把所有的情况都考虑进去了。注意0不能为数字之首,但是要特判一下只有两个数的情况。
STL中有全排列函数可以方便地适用,格式参照程序。加上头文件#include<algorithm>
读入的时候也要注意。
这道题就把所有给出的数全排列,然后把数字划分为数量靠近的两堆,数量要么都一样,要么后面一堆比前面一堆少一个,然后两堆中的数字按照顺序组成数,绝对值不断更新最小值。要让difference最小,那么一定是数字划分成两堆的时候数量也要靠近。这样划分方法加上全排列,可以确保把所有的情况都考虑进去了。注意0不能为数字之首,但是要特判一下只有两个数的情况。
STL中有全排列函数可以方便地适用,格式参照程序。加上头文件#include<algorithm>
读入的时候也要注意。
#include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<cstdlib> #define N 20 #define INF 0x3f3f3f3f using namespace std; int a ; int num(int x, int y) { int s = 0; for (int i = x; i < y; i++) s = s * 10 + a[i]; return s; } int main() { int n, cnt, min_m, m, k; char ch; scanf("%d", &n); getchar(); while (n--) { min_m = INF; cnt = 0; while ((ch = getchar()) != '\n') { if (ch == ' ') continue; a[cnt++] = ch - '0'; } if (cnt == 2) { min_m = abs(a[0] - a[1]); printf("%d\n", min_m); continue; } k = cnt/2; do { if (a[0] == 0 || a[k] == 0) continue; min_m = min(min_m, abs(num(0, k) - num(k, cnt))); }while(next_permutation(a, a+cnt)); printf("%d\n", min_m); } return 0; }
相关文章推荐
- js的闭包和this
- HTML5的新特性
- 前端工作总结
- redux笔记
- 【 D3.js 入门系列 — 0 】 简介和安装
- Jquery的选择器面试题
- AngularJS Scope(作用域)
- Javascript闭包(Closure)
- 应用json需要的jar包
- iOS 高级内存管理:比较__unsafe_unretain、__strong、__weak、__autoreleasing
- 关于webStrom-11.1配置less且自动生成.css和自动压缩为.min.css/.min.js
- web界面 初识jquery
- Jquery 用ajax请求后页面会自动刷新的问题
- jquery datatable 参数
- js页面跳转
- 【JavaScript】基础知识整理(一)
- CSS垂直居中的几种方法
- Extjs中的success和failure
- Javascript图表插件HighCharts用法案例
- JS回调函数(callback)