博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【搜索】POJ-2718 全排列+暴力
阅读量:5100 次
发布时间:2019-06-13

本文共 2375 字,大约阅读时间需要 7 分钟。

一、题目

Description

Given a number of distinct decimal digits, you can form one integer by choosing a non-empty subset of these digits and writing them in some order. The remaining digits can be written down in some order to form a second integer. Unless the resulting integer is 0, the integer may not start with the digit 0. 

For example, if you are given the digits 0, 1, 2, 4, 6 and 7, you can write the pair of integers 10 and 2467. Of course, there are many ways to form such pairs of integers: 210 and 764, 204 and 176, etc. The absolute value of the difference between the integers in the last pair is 28, and it turns out that no other pair formed by the rules above can achieve a smaller difference.

Input

The first line of input contains the number of cases to follow. For each case, there is one line of input containing at least two but no more than 10 decimal digits. (The decimal digits are 0, 1, ..., 9.) No digit appears more than once in one line of the input. The digits will appear in increasing order, separated by exactly one blank space.

Output

For each test case, write on a single line the smallest absolute difference of two integers that can be written from the given digits as described by the rules above.

Sample Input

10 1 2 4 6 7

Sample Output

28

二、思路&心得

  • next_permutation()函数的用法:注意若要得到全排列,则数组应该为有序的
  • 利用dfs + 回溯,再借以辅助数据visit可以找出一组数据的多种组合

三、代码

#include
#include
#define MAX 99999using namespace std;int nums[11];int t, len;char ch;void solve() { while (t --) { len = 0; while (1) { scanf("%d%c", &nums[len ++], &ch); if (ch == '\n') break; } if (len == 2) { printf("%d\n", abs(nums[0] - nums[1])); continue; } int num1, num2, ans = MAX; int mid = len / 2; do { num1 = nums[0], num2 = nums[mid]; if (!num1 || !num2) continue; for (int i = 1; i < mid; i ++) { num1 = num1 * 10 + nums[i]; } for (int i = mid + 1; i < len; i ++) { num2 = num2 * 10 + nums[i]; } if (abs(num1 - num2) < ans) ans = abs(num1 - num2); } while (next_permutation(nums, nums + len)); printf("%d\n", ans); }}int main() { scanf("%d", &t); solve(); return 0;}

转载于:https://www.cnblogs.com/CSLaker/p/7281194.html

你可能感兴趣的文章
EhReport ,CReport改进版本,再次改进 ,V1.31
查看>>
『ORACLE』 清理监听日志(11g)
查看>>
来自于一个问题的回答对自己的反思 php怎么发送邮件?发送邮件插件PHPMailer
查看>>
找的网上的js日期格式化问题出错了显示 一堆 NaN的东西
查看>>
eclipse快捷键
查看>>
Linux系统GNOME主题安装与Tweaks工具使用
查看>>
修改DNS服务器。
查看>>
SCP命令
查看>>
使用Flash Builder建SDK为3系列的项目默认为中文的修改方法
查看>>
SQL优化
查看>>
Luogu P1463 [HAOI2007]反素数ant:数学 + dfs【反素数】
查看>>
C#中建立treeView
查看>>
hadoop的安装和配置
查看>>
spinnaker
查看>>
hdu 1599 find the mincost route(无向图的最小环)
查看>>
转载:解读CSS布局之-水平垂直居中(2)
查看>>
第十八章 30限制数组越界
查看>>
浅谈unique列上插入重复值的MySQL解决方案
查看>>
hdu 4859(思路题)
查看>>
11.2.0.4 sql*loader/oci direct load导致kpodplck wait before retrying ORA-54
查看>>