zoukankan      html  css  js  c++  java
  • Codeforces Round #392 (Div. 2)-D. Ability To Convert

    D - Ability To Convert

    题目大意:给你一个数字 n 接下来再输入一个数字 w(<10^60),表示w这个数字是 n 进制的,

    并且超过十进制也用数字表示,这样就有多种组合了,问你所有组合中(划分方案中)原来的

    数字十进制最小是多少。 

    思路:网上说可以用贪心做,但是我感觉那个贪心比较奇怪,不是很理解,还是用dp靠谱。

    用dp[ i ] 表示从到第 i 个数字为止,最小十进制数最小是多少。

    初始状态 dp[ 0 ]=0。然后我们枚举起点向后更新。

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll inf=1e18;
    char s[100];
    int n;
    ll dp[100];
    int main()
    {
        cin>>n;
        scanf("%s",s+1);
        int len=strlen(s+1);
        for(int i=1;i<=len;i++) dp[i]=inf;
        dp[0]=0;
        for(int i=1;i<=len;i++)
        {
            if(s[i]=='0')//起始值不能为0,所以单独一位。
            {
                dp[i]=min(dp[i],n*dp[i-1]);
                continue;
            }
            ll now=0;
            for(int j=i;j<=len;j++)
            {
                now=now*10+s[j]-'0';
                if(now>=n) break; //超过n了
                if((inf-now)/n>=dp[i-1]) dp[j]=min(dp[j],dp[i-1]*n+now);// 不能直接用dp[i-1]*n+now判断,会爆long long 
            }
        }
        cout<<dp[len]<<endl;
        return 0;
    }
    View Code

    ps:以后遇到划分的问题,尽量考虑dp!!!!!

  • 相关阅读:
    Grafana、Prometheus、mtail-日志监控
    Grafana、Prometheus-监控平台
    vijos1062迎春舞会之交谊舞
    【模板】字符串哈希
    非递归方式打印4的全排列
    蚂蚁金服后端开发面试
    Intern Day163
    Intern Day156
    Intern Day153
    Intern Day153
  • 原文地址:https://www.cnblogs.com/CJLHY/p/7346255.html
Copyright © 2011-2022 走看看