POJ 2718 Smallest Difference(dfs,剪枝)
枚举两个排列以及有那些数字,用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,剪枝)相关推荐
- POJ 2718 Smallest Difference
题目 Smallest Difference Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19791 Accepted: 53 ...
- POJ 2718 Smallest Difference
分奇数和偶数两种情况进行讨论,奇数可贪心,偶数没想到贪心的方法,采用直接枚举的方法过的~~~ #include <cmath> #include <cstdio> #inclu ...
- POJ 2718 Smallest Difference 贪心构造
不用说,想让两个数的差最小,那这个两个数的位数要最接近. 不妨设a>b; 如果n是奇数 a就是最小的(n/2+1)位数,b就是最大的n/2位数 如果是偶数 枚举每一对相邻的数,大的作为a的第一位 ...
- poj 2870 Light Up(dfs+剪枝,写的稀烂)
半个下午+半个晚上,写的稀烂,各种粗心小错误,今天状态不佳啊. 一个点一个点枚举,判断是否可以放灯的时候就扫他的上下左右是否放过灯,用vis标记放过灯的位置. 放完全图后,再判断是否满足障碍物周围恰有 ...
- 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 ...
- POJ 2718【permutation】
POJ 2718 问题描述: 给一串数,求划分后一个子集以某种排列构成一个数,余下数以某种排列构成另一个数,求这两个数最小的差,注意0开头的处理. 超时问题:一开始是得到一个数列的组合之后再从中间进行 ...
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- poj2362 DFS+剪枝
题大致做法就是对所有小棒子长度求和sum,sum就是正方形的周长,sum/4就是边长side. 问题就转变为:这堆小棒子能否刚好组合成为4根长度均为side的大棒子 不难了解,小棒子的长度越长,其灵活 ...
- LintCode 387: Smallest Difference
LintCode 387: Smallest Difference 题目描述 给定两个整数数组(第一个是数组A,第二个是数组B),在数组A中取A[i],数组B中取B[j],A[i]和B[j]两者的差越 ...
最新文章
- 使用Python操作注册表
- 安卓手机chroot linux,在Android设备上安装 GNU/Linux Chroot 环境
- Echarts五步法加初体验
- XY插值算法C语言,常用的插值算法有哪些?
- lnmp之PDO_mysql.so
- eclipse安装spring boot插件spring tool suite
- Python IO模型
- “康园圈--互联网+校园平台“项目之拓展手机客户端
- Delphi使用ReportMachine制作小计和总计报表
- OpenGL glut导入OBJ模型文件
- python怎么读音发音英语翻译-python style是什么意思
- mapengpeng1999@163.com Web前端之JS
- 兰州理工大学计算机考研好考吗,兰州理工大学考研难吗
- 计算机网络基础以及进程查看管理
- 剥茧抽丝,细数模块化的前世今生
- python 3 4j不是合法的_3 4j 是合法Python数字类型。
- 【开发】开源的网络攻防黑客游戏d0x3d
- layui弹出层第一次打开不居中,第二次才居中
- arctanx麦克劳林公式推导过程_蔡勒(Zeller)公式及其推导:快速将任意日期转换为星期数...
- 回顾手机发展史,取消哪些功能让你感觉最可惜?
热门文章
- 类特征注意机制融合Deeplabv3+语义分割
- 定了!华为的AI技术路线向开发者开放!
- app商城源码_海量的SpringBoot和SSM项目【附带源码+视频教程】快速成为全栈
- 数据结构与算法-java笔记一 更新中
- 蓝牙 查询码 android,android bluetooth UUID蓝牙查询表
- Ubuntu16.04 ORB_SLAM2的安装教程
- C语言与JAVA内存管理_C语言动态内存管理和动态内存分配
- 【Android Studio】入门系列 4.1.Coding 定位目标
- grpc+protobuf 的C++ service 实例解析
- 什么是UML?分哪两类?