zoukankan      html  css  js  c++  java
  • POJ2718 递归套递归

    就是给你一个数,排列组合,然后问如何排列之间的差值最小。

    我之前的想法是一个递归,然后两个for循环枚举L1和L2,结果TLE了,然后想了一下剪枝发现没办法剪,然后看了一下别人的代码,用了next_permutation函数,虽然表示在书上看到过,但是具体确实没有用过,看到别人用了,虽然我也想用一下,但是还是觉得走正道吧,比较递归才是正道。不过这道题目,用了这个函数跑的比我的要快,6666

    当然我也思考过我第一个为什么会T,原因就是我的排列是10个A的无序排列相乘,但是那种种还加了双重循环,所以T了。然后这里的话就是单纯的枚举一种,然后第二种就定了,所以只有排列组合的相乘。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<cmath>
     5 
     6 using namespace std;
     7 const int inf = 0x3f3f3f3f;
     8 const int maxn = 15;
     9 int a[maxn];
    10 bool vis[maxn];
    11 int cnt;
    12 int mini;
    13 
    14 void minidfs(int l2, int tmp, int val2, int val1){
    15     if (l2 == 0){
    16         int t = abs(val2 - val1);
    17         mini = min(mini, t);
    18         return ;
    19     }
    20     for (int i = 1; i <= cnt; i++){
    21         if (vis[i]) continue;
    22         if (val2 == 0 && a[i] == 0 && l2 != 1) continue;
    23         vis[i] = true;
    24         minidfs(l2 - 1, tmp / 10, val2 + tmp * a[i], val1);
    25         vis[i] = false;
    26     }
    27 }
    28 
    29 void dfs(int l1, int tmp, int val1){
    30     if (l1 == 0){
    31         int t = 1;
    32         int l2 = (cnt + 1) / 2;
    33         for (int i = 1; i < l2; i++) t *= 10;
    34         //printf("%d
    ", l2);
    35         minidfs(l2, t, 0, val1);
    36         return ;
    37     }
    38     for (int i = 1; i <= cnt; i++){
    39         if (a[i] == 0 && val1 == 0 && l1 != 1) continue;
    40         if (vis[i])continue;
    41         vis[i] = true;
    42         dfs(l1 - 1, tmp / 10, val1 + a[i] * tmp);
    43         vis[i] = false;
    44     }
    45 }
    46 
    47 int main(){
    48     int t; cin >> t;
    49     getchar();
    50     while (t--){
    51         memset(vis, false, sizeof(vis));
    52         memset(a, 0, sizeof(a));
    53         cnt = 0;
    54         mini = inf;
    55         char ch = '0';
    56         while (ch != '
    '){
    57             scanf("%c", &ch);
    58             if (ch >= '0' && ch <= '9') a[++cnt] = ch - '0';
    59         }
    60         int tmp = 1;
    61         for (int i = 1; i < cnt / 2; i++) tmp *= 10;
    62         //printf("%d
    ", tmp);
    63         dfs(cnt / 2, tmp, 0);
    64         printf("%d
    ", mini);
    65     }
    66     return 0;
    67 }
    View Code
  • 相关阅读:
    Linux中zip基本用法
    containerd安装教程
    git拉取远程tag并进行代码crud
    pip环境安装
    Docker资源宿主机监控平台
    Docker部署Kafka单节点
    CRT——新建连接向导关闭了
    Excel——整行上移或下移
    DB2——DB2的字典视图
    Shell——windows上写完放入linux的时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/heimao5027/p/5638620.html
Copyright © 2011-2022 走看看