POJ2718 递归套递归
就是给你一个数,排列组合,然后问如何排列之间的差值最小。
我之前的想法是一个递归,然后两个for循环枚举L1和L2,结果TLE了,然后想了一下剪枝发现没办法剪,然后看了一下别人的代码,用了next_permutation函数,虽然表示在书上看到过,但是具体确实没有用过,看到别人用了,虽然我也想用一下,但是还是觉得走正道吧,比较递归才是正道。不过这道题目,用了这个函数跑的比我的要快,6666
当然我也思考过我第一个为什么会T,原因就是我的排列是10个A的无序排列相乘,但是那种种还加了双重循环,所以T了。然后这里的话就是单纯的枚举一种,然后第二种就定了,所以只有排列组合的相乘。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath> using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = ;
int a[maxn];
bool vis[maxn];
int cnt;
int mini; void minidfs(int l2, int tmp, int val2, int val1){
if (l2 == ){
int t = abs(val2 - val1);
mini = min(mini, t);
return ;
}
for (int i = ; i <= cnt; i++){
if (vis[i]) continue;
if (val2 == && a[i] == && l2 != ) continue;
vis[i] = true;
minidfs(l2 - , tmp / , val2 + tmp * a[i], val1);
vis[i] = false;
}
} void dfs(int l1, int tmp, int val1){
if (l1 == ){
int t = ;
int l2 = (cnt + ) / ;
for (int i = ; i < l2; i++) t *= ;
//printf("%d\n", l2);
minidfs(l2, t, , val1);
return ;
}
for (int i = ; i <= cnt; i++){
if (a[i] == && val1 == && l1 != ) continue;
if (vis[i])continue;
vis[i] = true;
dfs(l1 - , tmp / , val1 + a[i] * tmp);
vis[i] = false;
}
} int main(){
int t; cin >> t;
getchar();
while (t--){
memset(vis, false, sizeof(vis));
memset(a, , sizeof(a));
cnt = ;
mini = inf;
char ch = '';
while (ch != '\n'){
scanf("%c", &ch);
if (ch >= '' && ch <= '') a[++cnt] = ch - '';
}
int tmp = ;
for (int i = ; i < cnt / ; i++) tmp *= ;
//printf("%d\n", tmp);
dfs(cnt / , tmp, );
printf("%d\n", mini);
}
return ;
}
POJ2718 递归套递归的更多相关文章
- Reverse Linked List 递归非递归实现
单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...
- Java基础知识强化之IO流笔记12:递归之递归解决问题的思想(图解)
1. 使用递归计算5!的结果,递归思想的本质如下: 2. 下面就要使用代码实现这个递归: 递归实现分析: (1)做递归要写一个方法 (2)出口条件 (3)规律 代码实现如下: package com. ...
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...
- C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现【可运行】
C中二叉排序树的非递归和递归插入操作以及中序遍历代码实现[可运行] #include <stdio.h> #include <stdlib.h> typedef int Key ...
- [速记]关于指针,引用和递归和解递归——C++
在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...
- 二叉树的先序、中序以及后序遍历(递归 && 非递归)
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...
- Unity3D学习笔记——递归+非递归遍历GameObject的子物体
在Unity3D中没有提供直接的方法获取某个GameObject的子GameObject,但是所有的GameObject都有transform对象,所以,一般是通过获取子GameObject的tran ...
- Java基础知识强化之IO流笔记11:递归之递归概述和注意事项
1. 递归: 方法定义中调用方法本身的现象. e.g: public void show(int n ) { if(n <= 0) { System.exit(0); } System.out. ...
- recursion 递归以及递归的缺点
递归定义的算法有两部分: 递归基:直接定义最简单情况下的函数值: 递归步:通过较为简单情况下的函数值定义一般情况下的函数值. 应用条件与准则: (1)问题具有某种可借用的类同自身的子问题描述的性质: ...
随机推荐
- IIS启用GZip压缩
IIS启用GZip压缩,是提高网站速度和减轻服务器负载的一个优化手段和方法,经测试,网站启用GZip压缩后,速度快了3倍!而配置起来也相当的简单,因此被广大网站管理员使用.本文将详细介绍如何在IIS启 ...
- 利用Ajax实现前端与.net后端实现数据交互
使用场景和需求:用户在地址栏输入请求地址,先.net服务器发送页面请求,该页面包含Echart图表,在页面中向.net后端发送数据请求,获取数据后,将数据填充到Echart图表中.其中包含带参与不带参 ...
- java 图形界面 Socket编程
一.使用图形界面实现客户端服务器端的通信: 上代码: 服务器端代码: package cn.MyNET; import java.io.*; import java.net.*; import jav ...
- RSA 公私钥 互换问题
关于 RSA,我的理解是: 按定义的话,公私钥是可以互换的 问题是常见的实现里面,保存“私钥”的那个数据结构或者文件,里面除了私钥所必需的那一对数之外,还有额外的信息(足以算出公钥来),所以绝对不能把 ...
- 《JavaScript高级程序设计》读书笔记 ---if语句
if语句 大多数编程语言中最为常用的一个语句就是if 语句.以下是if 语句的语法:if (condition) statement1 else statement2其中的condition(条件)可 ...
- VBS基础篇 - 杂项 - Sendkeys
VBS基础篇 - 杂项 - Sendkeys 模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行 其使用格式为:object.SendKeys(string) obj ...
- Windows 8/7下还原系统默认扩展名打开方式类型
在百度知道上如果你搜“改回选错的打开方式”,看到的大多数都是XP系统的方法,不管是批处理还是别的方法,但适用于Windows 8/7的只有修改注册表的方法. 因为Windows 7你也就根本找不到[工 ...
- http header cache-control (request和response区别)
摘要:(1)网络服务会根据 request的header中的 cache-control策略设置response的cache-control策略 1 response cache-control 和 ...
- Ubuntu14.04+cuda 7.5+cudnn_v4+tensorflow安装
系统环境:Ubuntu14.04 64位.Windows7 64位 双系统 CUDA 版本: 7.5 总结一下,我的安装建议是: 一定要下一份CUDA官方的安装文档,按照它的步骤一步步慢慢来,不可偷懒 ...
- python--sorted函数
摘自:http://www.cnblogs.com/65702708/archive/2010/09/14/1826362.html 我们需要对List进行排序,Python提供了两个方法对给定的Li ...