枚举两个排列以及有那些数字,用dfs比较灵活。

dfs1是枚举长度短小的那个数字,dfs2会枚举到比较大的数字,然后我们希望低位数字的差尽量大,

后面最优全是0,如果全是0都没有当前ans小的话就剪掉。

(第1个dfs完了,忘了加return。。。

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std;//string line;
int line[11];
bool vis[11];
int len1,len2, n;
const int wei[] = {1,10,100,1000,10000,100000,1000000};
int ans;
int num1;void dfs2(int d,int cur)
{if(abs(num1 - cur*wei[len2-d]) >= ans) return;if(d == len2){ans = min(ans,abs(num1-cur));return;}for(int j = 0; j < n; j++){if(!vis[j]){vis[j] = true;dfs2(d+1,cur*10+line[j]);vis[j] = false;}}
}//permutation
void dfs1(int d,int cur)
{if(d == len1){num1 = cur;for(int fi = 0; fi < n; fi++){if(!vis[fi] && line[fi]){vis[fi] = true;dfs2(1,line[fi]);vis[fi] = false;}}return;}for(int j = 0; j < n; j++){if(!vis[j]){vis[j] = true;dfs1(d+1,cur*10+line[j]);vis[j] = false;}}
}//0 2 , 0 3//#define LOCAL
int main()
{
#ifdef LOCALfreopen("in.txt","r",stdin);
#endifint T; scanf("%d",&T);scanf("\n");while(T--){char ch;n = 0;while((ch = getchar())!= '\n'){if(isdigit(ch)){line[n++] = ch-'0';}}if(n == 2){ printf("%d\n",abs(line[0]-line[1])); continue; }len1 = n>>1; len2 = n-len1;ans = 1<<30;memset(vis,0,sizeof(vis));for(int fi = 0; fi < n; fi++){if(line[fi]){vis[fi] = true;dfs1(1,line[fi]);vis[fi] = false;}}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/jerryRey/p/4889693.html

POJ 2718 Smallest Difference(dfs,剪枝)相关推荐

  1. POJ 2718 Smallest Difference

    题目 Smallest Difference Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19791 Accepted: 53 ...

  2. POJ 2718 Smallest Difference

    分奇数和偶数两种情况进行讨论,奇数可贪心,偶数没想到贪心的方法,采用直接枚举的方法过的~~~ #include <cmath> #include <cstdio> #inclu ...

  3. POJ 2718 Smallest Difference 贪心构造

    不用说,想让两个数的差最小,那这个两个数的位数要最接近. 不妨设a>b; 如果n是奇数 a就是最小的(n/2+1)位数,b就是最大的n/2位数 如果是偶数 枚举每一对相邻的数,大的作为a的第一位 ...

  4. poj 2870 Light Up(dfs+剪枝,写的稀烂)

    半个下午+半个晚上,写的稀烂,各种粗心小错误,今天状态不佳啊. 一个点一个点枚举,判断是否可以放灯的时候就扫他的上下左右是否放过灯,用vis标记放过灯的位置. 放完全图后,再判断是否满足障碍物周围恰有 ...

  5. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  6. POJ 2718【permutation】

    POJ 2718 问题描述: 给一串数,求划分后一个子集以某种排列构成一个数,余下数以某种排列构成另一个数,求这两个数最小的差,注意0开头的处理. 超时问题:一开始是得到一个数列的组合之后再从中间进行 ...

  7. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  8. poj2362 DFS+剪枝

    题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...

  9. LintCode 387: Smallest Difference

    LintCode 387: Smallest Difference 题目描述 给定两个整数数组(第一个是数组A,第二个是数组B),在数组A中取A[i],数组B中取B[j],A[i]和B[j]两者的差越 ...

最新文章

  1. 使用Python操作注册表
  2. 安卓手机chroot linux,在Android设备上安装 GNU/Linux Chroot 环境
  3. Echarts五步法加初体验
  4. XY插值算法C语言,常用的插值算法有哪些?
  5. lnmp之PDO_mysql.so
  6. eclipse安装spring boot插件spring tool suite
  7. Python IO模型
  8. “康园圈--互联网+校园平台“项目之拓展手机客户端
  9. Delphi使用ReportMachine制作小计和总计报表
  10. OpenGL glut导入OBJ模型文件
  11. python怎么读音发音英语翻译-python style是什么意思
  12. mapengpeng1999@163.com Web前端之JS
  13. 兰州理工大学计算机考研好考吗,兰州理工大学考研难吗
  14. 计算机网络基础以及进程查看管理
  15. 剥茧抽丝,细数模块化的前世今生
  16. python 3 4j不是合法的_3 4j 是合法Python数字类型。
  17. 【开发】开源的网络攻防黑客游戏d0x3d
  18. layui弹出层第一次打开不居中,第二次才居中
  19. arctanx麦克劳林公式推导过程_蔡勒(Zeller)公式及其推导:快速将任意日期转换为星期数...
  20. 回顾手机发展史,取消哪些功能让你感觉最可惜?

热门文章

  1. 类特征注意机制融合Deeplabv3+语义分割
  2. 定了!华为的AI技术路线向开发者开放!
  3. app商城源码_海量的SpringBoot和SSM项目【附带源码+视频教程】快速成为全栈
  4. 数据结构与算法-java笔记一 更新中
  5. 蓝牙 查询码 android,android bluetooth UUID蓝牙查询表
  6. Ubuntu16.04 ORB_SLAM2的安装教程
  7. C语言与JAVA内存管理_C语言动态内存管理和动态内存分配
  8. 【Android Studio】入门系列 4.1.Coding 定位目标
  9. grpc+protobuf 的C++ service 实例解析
  10. 什么是UML?分哪两类?