• 【codeforces 758D】Ability To Convert


    【题目链接】:http://codeforces.com/contest/758/problem/D

    【题意】

    给你一个n进制的数k;
    问你它可能的最小的十进制数是多少;

    【题解】

    从右往左;
    获取数字;
    如果这个数字小于n就一直往左扩大;
    尽量大;
    这样把尽可能多的数字放在权值的低位;
    这样n进制数的位就会尽可能地少;
    十进制数也就尽可能地小了;
    但是有前导0的情况;
    这个判断前导0有点麻烦;

    10011
    你不好获取
    0011这个数字的信息;
    即是不是到了从右往左数第二个0的时候,就该停下来了;
    这个可以先预处理出101..12
    然后看看当前处理的数字的可能最小值是不是小于n;如果最小的都大于等于n了就不用继续了;
    必须得这样做不然对于
    2
    10000000000000000000000000
    这样的数据;
    如果你算到了第一个数字才发觉大于n了;
    那么你算出来的数字 10000000000000000000000000可能会爆long long

    【Number Of WA

    0

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define ps push_back
    #define fi first
    #define se second
    #define rei(x) cin >> x
    #define ms(x,y) memset(x,y,sizeof x)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 110;
    
    int n;
    char s[100];
    LL temp = 1,ans = 0,tenpow[15];
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        ios::sync_with_stdio(false);
        rei(n);
        cin >> (s+1);
        int len = strlen(s+1),pre = len;
        LL dd = 0,now = 1;
        tenpow[0] = 1;
        rep1(i,1,12)
            tenpow[i] = tenpow[i-1]*10;
        rep2(i,len,1)
        {
            LL tdd = dd+now*(s[i]-'0');
            LL ju = (pre-i+1);
            now=now*10;
            if ((s[i]!='0' ||(s[i]=='0' && tenpow[ju]<n)||i==len )&& tdd<n)
            {
                dd = tdd;
            }
            else
                //tdd>=n
            {
                int j = i+1;
                while (s[j]=='0' && j+1<=pre)
                {
                    j++;
                }
                ans += dd*temp;
                temp=temp*n;
                i = j-1;
                pre = i;
                dd = s[i]-'0';
                now = 10;
            }
        }
        ans += dd*temp;
        cout << ans << endl;
        //printf("
    %.2lf sec 
    ", (double)clock() / CLOCKS_PER_SEC);
        return 0;
    }
  • 相关阅读:
    日期获取以及时间转化
    ddt 接口框架数据处理调用excel 处理
    ddt 测试用例UI运用
    动态验证码处理UI自动化获取处理
    Bug Report For .Net (zz.IS2120@BG57IV3)
    中关村翠湖科技园:高端产业聚集区 (zz.IS2120@BG57IV3.T752270541 .K)
    vc6,windows 7 x64 调试 (IS2120@BG57IV3)
    Excel c#Excel文件的操作[转载]
    NUnit学习 标签、方法 记录与说明
    Excel c#Excel工作进程的创建写 与Excel文件的保存[原创] (20100205 11:09)
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626446.html
Copyright © 2020-2023  润新知