POJ 2718

问题描述:

给一串数,求划分后一个子集以某种排列构成一个数,余下数以某种排列构成另一个数,求这两个数最小的差,注意0开头的处理。

超时问题:一开始是得到一个数列的组合之后再从中间进行切割得到两数,会超时。后来采用的方法是将前面的数在DFS中得到固定,在函数work中对后面(n-n/2)个数进行排列组合。

针对整个数列的dfs排列组合剪枝,若当前搜索的第二个数后面全部补零与第一个数所产生的差值比当前所搜索到的结果还要大,那么就直接返回。这个剪枝就是超时与几十MS的差距
int nums[10]={1,10,100,1000,10000,100000,1000000};

解法一:朴素permutation

#include <iostream>
#include <algorithm>
#include <map>
#include <string>
#include <string.h>
#include <ctype.h>
#include <vector>
#include <math.h>
using namespace std;char s[1000];
int t;
int main()
{cin>>t;getchar();while(t--){int a[11],num=0,ans=0x7f7f7f;gets(s);for(int i=0;i<strlen(s);i++)if (s[i] >= '0'&&s[i] <= '9')//删除空格a[num++]=s[i]-'0';sort(a,a+num);do{int num1=0,num2=0;//前面那个数的首位不能是0,后面那个数的首位也不能是0,还有当为输入是10时,要么前面那个数的是0,要么后面的那个数是0,所以条件num>2加"||"前后都一样if(!a[0]||(!a[num/2] && num>2))continue;for(int i=0;i<num/2;i++)num1=num1*10+a[i];for(int i=num/2;i<num;i++)num2=num2*10+a[i];ans=min(ans,abs(num1-num2));}while(next_permutation(a, a+num));cout<<ans<<endl;}return 0;
}

解法二:dfs+permutation

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>//next_permutation包含其中
using namespace std;int a[15], vis[15], n, ans, aa, bb;void solve(int aa) {int len = 0, flag = 1, b[15];bb = 0;for(int i = 0; i < n; i++)if(!vis[i]) b[len++] = a[i];for(int i = 0; i < len; i++) {if(i == 0 && b[i] == 0) flag = 0;bb = bb * 10 + b[i];}if(flag) ans = min(ans, abs(aa-bb));while(next_permutation(b, b+len)) {bb = 0;flag = 1;for(int i = 0; i < len; i++) {if(i == 0 && b[i] == 0) flag = 0;bb = bb * 10 + b[i];}if(flag) ans = min(ans, abs(aa-bb));}return;
}void dfs(int k, int res) {if(k == n/2) {solve(res);return;}for(int i = 0; i < n; i++) {if(!vis[i]) {if(a[i] == 0 && k == 0) continue;vis[i] = 1;dfs(k+1, res*10+a[i]);vis[i] = 0;}}return;
}int main() {int kase;scanf("%d", &kase);getchar();while(kase--) {n = 0;char ch;memset(a, 0, sizeof(a));memset(vis, 0, sizeof(vis));while((ch = getchar()) != '\n') {if(ch == ' ')continue;else a[n++] = ch - '0';}if(n == 2 && a[0] == 0) {           //当只有两个数字,且其中一个为0时,特殊处理printf("%d\n", a[1]-a[0]);continue;}ans = 1 << 30;dfs(0, 0);printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/demian/p/6551576.html

POJ 2718【permutation】相关推荐

  1. 【简●解】POJ 1845 【Sumdiv】

    POJ 1845 [Sumdiv] [题目大意] 给定\(A\)和\(B\),求\(A^B\)的所有约数之和,对\(9901\)取模. (对于全部数据,\(0<= A <= B <= ...

  2. 《挑战程序设计竞赛》--初级篇习题POJ部分【动态规划】

    关于基本的动态规划和经典的动态规划,在之前已经总结过了,可以温习一下: 传送门 这次是延续上次的<挑战程序设计竞赛>初级篇,总结部分poj上的练习题,主要是DP方面的练习题: 一.基础的动 ...

  3. POJ 1845 【数论】

    题目链接:POJ 1845 题意 求ababa^b的所有约数之和,最终结果对9901求模 需要知识 1.快速幂:二分法求nmnmn^m的结果 2.因数分解:遍历求出所有因数 3.约数和定理:假设n=p ...

  4. Oulipo POJ - 3461【KMP】

    这道题说了很多,但其实就是给了你两个字符串p和t,输出p在t中出现的次数 在KMP模板上的改动是 if(j==len1){ // printf("i=%d j=%d\n",i,j) ...

  5. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  6. poj 2411 Mondriaan#39;s Dream 【dp】

    题目:poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然后问你最多由多少种不同的方案. 分析:这是一个比較经典的题目.网上各种牛B写法一大堆. ...

  7. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  8. Bailian2676 整数的个数【入门】(POJ NOI0105-11)

    问题链接:POJ NOI0105-11 整数的个数 2676:整数的个数 总时间限制: 1000ms 内存限制: 65536kB 描述 给定k(1 < k < 100)个正整数,其中每个数 ...

  9. Bailian2735 八进制到十进制【入门】(POJ NOI0113-46)

    问题链接:POJ NOI0113-46 八进制到十进制 2735:八进制到十进制 总时间限制: 1000ms 内存限制: 65536kB 描述 把一个八进制正整数转化成十进制. 输入 一行,仅含一个八 ...

最新文章

  1. linux 用户行为审计update1
  2. 【知识星球】为什么图像分类任务要从256*256中裁剪出224*224
  3. ubuntu16.04安装VMware网络配置
  4. Mono新突破:CentOS 7.2下安装Mono 5.0
  5. python迭代器举例_如何最简单、通俗地理解Python的迭代器?
  6. 软考信息安全工程师备考笔记7:第七章信息系统安全工程备考要点
  7. python 释放链表节点_redis:链表
  8. iOS 去掉UISearchBar输入框上面的黑线
  9. 手机页面内容超出屏幕宽度时实现可拖拉滑动效果
  10. python与西门子1200通讯_西门子S7-1200的以太网通信
  11. 普元 EOS Platform 7.6 Studio导出流程par包,在workspace中导入报错:租户令牌不正确,部署失败
  12. 【秋招面经】全网最全大华前端题目总结
  13. java工作流(原生)
  14. md5的特点以及加密原理
  15. php 不报notice错误,PHP新手NOTICE错误常见解决方法_PHP教程
  16. oracle 计算时间差 毫秒,Oracle计算时间差为毫秒的实现代码
  17. java gette_Java setter,getter(滚压模具)
  18. 蓝桥杯之单片机设计与开发(18)——模数转换A/D与数模转换D/A
  19. 假装接入阿里云---PC运行mqtt.fx
  20. xubuntu系统关闭自动锁屏和待机

热门文章

  1. 200本“保护日记”记录黄山迎客松生长变化
  2. 正点原子Linux驱动第三期
  3. Unity3d之多人游戏与网络(联机冰球对战)
  4. 天刀手游服务器维护时间20日,《天涯明月刀手游》12月17日服务器维护更新公告...
  5. android+解锁风格,Android开发实现图案解锁功能
  6. iOS 让你的app 支持与itunes之间传输文稿
  7. 手机恢复出厂设置命令_手机恢复出厂设置是什么意?
  8. ps一些比较有用的要点
  9. 小米mix Android9,小米mix3的系统是安卓9吗?
  10. 互联网燕窝翻车记:一瓶燕窝就把辛巴拖下快手一哥