[挑战程序设计竞赛] POJ 2718 - Smallest Difference
2014-11-28 15:43
399 查看
题意:
给定0~9之间的一些不重复的数字,把这些数字任意组合成两部分,求两部分数字的差的绝对值的最小值。(注意不能有前导0~)
仔细想了一下发现:
当给定数字个数为奇数时,两部分的个数应该是差一位的。
当给定数字个数为偶数时,两部分的个数应该是相等的。
用DFS做了一下,结果提交后TLE了,然后想了一下,发现输入的数字的个数为10的时候,结果只有一种~
于是特判数字个数为10的时候,直接输出结果。。这题就被水过了。。
给定0~9之间的一些不重复的数字,把这些数字任意组合成两部分,求两部分数字的差的绝对值的最小值。(注意不能有前导0~)
仔细想了一下发现:
当给定数字个数为奇数时,两部分的个数应该是差一位的。
当给定数字个数为偶数时,两部分的个数应该是相等的。
用DFS做了一下,结果提交后TLE了,然后想了一下,发现输入的数字的个数为10的时候,结果只有一种~
于是特判数字个数为10的时候,直接输出结果。。这题就被水过了。。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int a[15], cnt, ans, vis[11], b[15]; int abs(int x) { if(x < 0) { return -x; } return x; } void dfs(int deep) { if(deep == cnt) { int left = 0; int mid = cnt / 2; for(int j = 0; j < mid; j++) { if(b[0] == 0 && mid > 1) { return ; } left = left * 10 + b[j]; } int right = 0; for(int j = mid; j < cnt; j++) { if(b[mid] == 0 && cnt > mid + 1) { return ; } right = right * 10 + b[j]; } ans = min(ans, abs(left - right)); } else { for(int i = 0; i < cnt; i++) { if(!vis[i]) { b[deep] = a[i]; vis[i] = 1; dfs(deep + 1); vis[i] = 0; } } } } int main() { int T; char ch; while(~scanf("%d", &T)) { getchar(); for(int i = 0; i < T; i++) { ans = 1000000000; memset(vis, 0, sizeof(vis)); cnt = 0; while((ch = getchar()) != '\n') { if(ch >= '0' && ch <= '9') a[cnt++] = ch - '0'; } if(cnt == 10) { printf("247\n"); continue; } dfs(0); printf("%d\n", ans); } } }
相关文章推荐
- poj2376 区间贪心 <挑战程序设计竞赛>
- 挑战程序设计竞赛 POJ 1192食物链 带权并查集,略麻烦
- [挑战程序设计竞赛] POJ 3699 - Meteor Shower
- poj 3061 (挑战程序设计竞赛3.2.1)
- 挑战程序设计竞赛---POJ.3233
- [挑战程序设计竞赛] POJ 1328 - Radar Installation
- [挑战程序设计竞赛] POJ 3040 - Allowance
- POJ 2991 Crane 线段树+计算几何 出自“挑战程序设计竞赛”
- poj1979解体报告(挑战程序设计竞赛)
- [挑战程序设计竞赛] POJ 2376 - Cleaning Shifts
- 挑战程序设计竞赛 POJ 2431 贪心+优先队列
- poj1064 二分搜索 挑战程序设计竞赛
- 挑战程序设计竞赛 poj 2431 优先队列
- [挑战程序设计竞赛] POJ 3187 - Backward Digit Sums
- poj2456 二分搜索 <挑战程序设计竞赛>
- [挑战程序设计竞赛] POJ 1862 - Stripies
- [挑战程序设计竞赛] POJ 3009 - Curling 2.0
- poj1328 区间贪心 <挑战程序设计竞赛>
- [挑战程序设计竞赛] POJ 3050 - Hopscotch
- poj2393 其它贪心 <挑战程序设计竞赛>