• Codeforces 915 C. Permute Digits (dfs)


    题目链接:Permute Digits

    题意:

      给出了两个数字a,b(<=1e18),保证a,b都不带前缀0。用a的字符重组一个数字使这个值最大且小于b。(保证这个值存在)

    题解:

      这题遇到了不止一遍了,但是每次都会写错~所以感觉很有必要写下来。看到这题,我的第一想法是贪心每次都取最大的。但是这样其实存在很大的漏洞,因为字符个数是有限的如果小的数被取完了大的数填充进去也不符合条件。这题要按DFS的思路去做才行。这里给出按贪心的做法的一组错误数据。

    a: 123456789123456789

    b: 276193619183618162

    my_output: 276193618987554432

    answer: 276193618987554432

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int MAX_N = 1e3+9;
     4 char vec[MAX_N];
     5 char s[MAX_N];
     6 int res[MAX_N];
     7 char out[MAX_N];
     8 int point;
     9 void dfs(int pos,int flag,int len)
    10 {
    11     if(pos == len)
    12     {
    13         out[len] = '';
    14         printf("%s
    ",out);
    15         exit(0);
    16     }
    17     //cout<<"...."<<endl;
    18     int t = pos+point;
    19     if(flag)
    20     {
    21         bool f = true;
    22         for(int j=9; j>=0; j--)
    23         {
    24             if(res[j])
    25             {
    26                 out[pos] = j+'0';
    27                 res[j]--;
    28                 dfs(pos+1,flag,len);
    29                 res[j]++;
    30             }
    31         }
    32         if(f) return;
    33     }
    34     else
    35     {
    36         bool f = true;
    37         for(int j=s[t]-'0'; j>=0; j--)
    38         {
    39             if(res[j])
    40             {
    41                 //cout<<"......"<<j<<"..."<<s[t]<<endl;
    42                 out[pos] = j+'0';
    43                 res[j]--;
    44                 if(j==s[t]-'0') dfs(pos+1,0,len);
    45                 else dfs(pos+1,1,len);
    46                 res[j]++;
    47             }
    48         }
    49         if(f) return;
    50     }
    51 
    52 
    53 }
    54 int main()
    55 {
    56     int N,M,T;
    57     memset(res,0,sizeof(res));
    58     scanf("%s",vec);
    59     scanf("%s",s);
    60     int len = strlen(vec);
    61     for(int i=0; i<len; i++) res[vec[i]-'0']++;
    62     int l = strlen(s);
    63     point = l - len;
    64     if(point > 0) dfs(0,1,len);
    65     else dfs(0,0,len);
    66     return 0;
    67 }
  • 相关阅读:
    背包——[Usaco2007 Jan]Running POJ3661
    KMP的next函数——BZOJ1355
    对括号匹配问题的在深入思考
    优先队列——[Usaco2009 Open]工作安排Job
    完全背包——poj 3181
    奇异数
    背包计数
    最大递增子序和——POJ3616
    大组合数取模——fzu 2020(可做模板)
    activemq 代码库
  • 原文地址:https://www.cnblogs.com/doggod/p/8417149.html
Copyright © 2020-2023  润新知