Smallest Difference

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 19528   Accepted: 5329

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

1
0 1 2 4 6 7

Sample Output

28

题意:n个数字分成两部分,构成两个整数,求这两个整数的最小差

题解:1、直接用函数next_pertumation()全排列
2、用dfs实现next_pertumation()功能
#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
int t,cnt,ans;
int a[];
string s; int main()
{
cin>>t;
getchar();
while(t--)
{
cnt=,ans=;
getline(cin,s);
for(int i=;s[i];i++)
{
if(isdigit(s[i]))
a[cnt++]=s[i]-'';
}
if(cnt==)//特例判断 0 1
{
cout<<abs(a[]-a[])<<endl;
continue;
}
while(a[]==)//如果首位数为0,在排一次序之后就不是了
next_permutation(a,a+cnt);
do
{
if(a[cnt/]!=)//首位不能为0
{
int num1=,num2=;
for(int i=;i<cnt/;i++)
num1=num1*+a[i];
for(int i=cnt/;i<cnt;i++)
num2=num2*+a[i];
ans=min(ans,abs(num1-num2));
} }while(next_permutation(a,a+cnt));
cout<<ans<<endl;
}
return ;
}
#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
int t,cnt,ans;
int a[],b[],vis[];
string s; void dfs(int dep)
{
if(dep==cnt)
{
int num1=,num2=;
for(int i=;i<cnt/;i++)
num1=num1*+b[i];
for(int i=cnt/;i<cnt;i++)
num2=num2*+b[i];
ans=min(ans,abs(num1-num2));
return ;
} for(int i=;i<cnt;i++)
{
if(vis[i]==)
continue;
if(dep==&&a[i]==)
continue;
if(dep==cnt/&&a[i]==)
continue;
vis[i]=;
b[dep]=a[i];
dfs(dep+);
vis[i]=;
}
}
int main()
{
cin>>t;
getchar();
while(t--)
{
memset(vis,,sizeof(vis));
cnt=,ans=;
getline(cin,s);
for(int i=;s[i];i++)
{
if(isdigit(s[i]))
a[cnt++]=s[i]-'';
}
if(cnt==)
{
cout<<abs(a[]-a[])<<endl;
continue;
}
if(cnt==)//防止tle
{
cout<<<<endl;
continue;
}
dfs();
cout<<ans<<endl;
}
return ;
}

POJ 2718 Smallest Difference dfs枚举两个数差最小的更多相关文章

  1. POJ 2718 Smallest Difference(dfs,剪枝)

    枚举两个排列以及有那些数字,用dfs比较灵活. dfs1是枚举长度短小的那个数字,dfs2会枚举到比较大的数字,然后我们希望低位数字的差尽量大, 后面最优全是0,如果全是0都没有当前ans小的话就剪掉 ...

  2. POJ 2718 Smallest Difference(最小差)

     Smallest Difference(最小差) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 Given a numb ...

  3. POJ 2718 Smallest Difference(贪心 or next_permutation暴力枚举)

    Smallest Difference Description Given a number of distinct decimal digits, you can form one integer ...

  4. POJ 2718 Smallest Difference 枚举

    http://poj.org/problem?id=2718 题目大意: 给你一些数字(单个),不会重复出现且从小到大.他们可以组成两个各个位上的数字均不一样的数,如 0, 1, 2, 4, 6 ,7 ...

  5. poj 2718 Smallest Difference(暴力搜索+STL+DFS)

    Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6493   Accepted: 17 ...

  6. POJ 2718 Smallest Difference【DFS】

    题意: 就是说给你一些数,然后要求你使用这些数字组成2个数,然后求他们的差值最小. 思路: 我用的双重DFS做的,速度还比较快,其中有一个很重要的剪枝,若当前搜索的第二个数后面全部补零与第一个数所产生 ...

  7. poj 2718 Smallest Difference(穷竭搜索dfs)

    Description Given a number of distinct , the integer may not start with the digit . For example, , , ...

  8. 穷竭搜索: POJ 2718 Smallest Difference

    题目:http://poj.org/problem?id=2718 题意: 就是输入N组数据,一组数据为,类似 [1  4  5  6  8  9]这样在0~9之间升序输入的数据,然后从这些数据中切一 ...

  9. POJ - 2718 Smallest Difference(全排列)

    题意:将n个数字分成两组,两组分别组成一个数字,问两个数字的最小差值.要求,当组内数字个数多于1个时,组成的数字不允许有前导0.(2<=n<=10,每个数字范围是0~9) 分析: 1.枚举 ...

随机推荐

  1. 测量设备自动化-AK协议

    1.AK协议定义 AK协议是控制器和测量设备之间通信的方式,广泛应用于整车耐久转毂等测试中,如AVL VECON.人们通常都是用VECON界面设置试验曲线,但通过AK可以实现设备的自动化.如下图所示: ...

  2. CSS - 背景半透明

    就一句话 background: rgba(0, 0, 0, .2); body { background-color: pink; } div { width: 200px; height: 200 ...

  3. Do You Know These Plastic Bottle Processing Terms?

    The molding process of a plastic bottle refers to a process of making a final plastic article from a ...

  4. GO 回调实现

    函数作为参数传递,实现回调. package main import "fmt" // 声明一个函数类型 type cb func(int) int func main() { t ...

  5. 在abp core中出现运行项目时EF获取到的appsetting.json或者appsettings.Production.json中的连接字符串为空

    原因:有可能是生成的bin或者debug文件夹下没有将appsetting.json或者appsettings.Production.json文件生成过去 解决方法:手动拷贝过去,或者设置成自动生成过 ...

  6. 【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ

    题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=10 ...

  7. SpringBoot Controller找不到视图路径

    在启动类加注解@ComponentScan("com.controller")即可,括号里表示Controller所在包名. 参考:https://blog.csdn.net/ji ...

  8. c++模板(翁恺c++公开课[34-35]学习笔记)

    为什么要有模板(templates):当我们需要一个列表(list),列表中元素可能都为X类型也可能都为Y类型,怎么来实现呢? 定义基类?可以实现,很多情况下可能不够简明的表达设计思想 克隆代码(写一 ...

  9. day22-Python运维开发基础(正则函数 / 异常处理)

    1. 正则函数 # ### 正则表达式 => 正则函数 import re # search 通过正则匹配出第一个对象返回,通过group取出对象中的值 strvar = "5*7 9 ...

  10. 修改vue中的挂载页面(index.html)的路径

    修改vue中的挂载页面(index.html)的路径 2019年03月30日 12:07:12 VegasLemon 阅读数 501    版权声明:本文为博主原创文章,未经博主允许不得转载. htt ...