codeforces 758 D

n进制

n进制数

求一个最小的十进制数上面那个数可以变成

一眼看到就是不会   看题解

是区间DP

dp[i] 从前处理到i位的最小的数

dp[i]=min(dp[i],dp[i-1]*n+now);

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<set>
#include<string>

using namespace std;
typedef long long LL;

#define inf  2000000000000000000
#define MAXN 65
char str[MAXN];
LL   dp[MAXN];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        scanf("%s",str+1);
        int len=strlen(str+1);
        for(int i=1;i<=len;i++)
            dp[i]=inf;
        dp[0]=0;
        for(int i=1;i<=len;i++)
        {
            LL now=0;
            for(int j=i;j<=len;j++)
            {
                now=now*10+str[j]-‘0‘;
                if(str[i]==‘0‘&&j>i)  //不能有00  01...
                    break;
                if(now>=n)
                    break;
                if(1.0*dp[i-1]*n+now>2e18) //这个数<2e18  题目写了
                    continue;
                dp[j]=min(dp[j],dp[i-1]*n+now);
            }
        }
        printf("%lld\n",dp[len]);
    }
    return 0;
}
时间: 2024-10-10 06:58:44

codeforces 758 D的相关文章

CodeForces 758 D Ability To Convert

Ability To Convert 题意:给你一个n进制的60位的数,但是由于Alexander只会写0->9,所以他就会用10来表示十而不是A(假设进制>10); 题解:模拟就好了,先走往前走进制的位数的倍数,再判断一下首位是不是0,或者这个数有没有大于等于进制,如果有就不行,就要往后走,走到一个非0开头的点,或者就是走到只有1个0的点,然后算出目前这段区间的答案加一个倍数就好了. 代码: 1 #include<bits/stdc++.h> 2 using namespace

CodeForces 758 C Unfair Poll

Unfair Poll 题意:一共有n排同学每排同学有m个人, 老师问问题有一个顺序, 先从第一排开始问,问完第一排的所有同学之后,再问第2排的,对于所有排的访问顺序为 1,2,3--n-1,n,n-1,n-2,--,2,1,2,然后每次访问到新的一排先要问完这一排的所有人才会往下一(目标)排走. 题解:先声明我们开一个数组来记录这一排被询问的总次数,先将k  /= m, 这个代表的是完全访问的次数,即一整排m位同学都问完有几次,如果  完全访问的次数< n, 我们就将前几排全访问次数的人都加上

Codeforces 758D Ability To Convert dp

题目链接: http://codeforces.com/problemset/problem/758/D 题意: 一个n进制下的数k,其中k不会用字母,如果有A就用10代替了.求k这个数对应的,在10进制下最小的数. 思路: 来自:http://www.cnblogs.com/TreeDream/p/6322755.html 本质上是把数字分成若干段使得每一段 <n 且没有前导 0 dp[i] 表示前 i 个字符划分好之后能得到的最小数. 状态枚举下一段怎么切. 枚举每一个分割点,对什么进行更新

Codeforces 758B:Blown Garland(模拟)

http://codeforces.com/problemset/problem/758/B 题意:给出一个字符串,每4个位置对应一个颜色,如果为‘!’的话,代表该灯泡是坏的,问最后每个颜色坏的灯泡的数目. 思路:题意实在挺难懂的(可能我到现在还没看懂).看样例看了好久才看出来.例如最后一个样例“!GB!RG!Y!”:可以拆分成"!GB!”,"RG!Y","!",R只在第一个位置出现,说明R是在第一个位置的,以此类推,G是在第二个位置,B是在第三个位置,Y

Codeforces 758C:Unfair Poll(思维+模拟)

http://codeforces.com/problemset/problem/758/C 题意:教室里有n列m排,老师上课点名从第一列第一排开始往后点,直到点到第一列第m排,就从第二列第一排开始点,当点完第n列的名之后,接着点第n-1列的名.以此类推,就是从列上来看的话:1,2,3,4,……,n,n-1,n-2,……,1 ,2,…….这样的顺序点名.老师上课总共点k次名,问该课堂最多可以点同一个同学多少次,最少可以点同一个同学多少次,点了位置为(x,y)的同学多少次名. 思路:一遇到这种题目

Codeforces Round #392 (Div. 2) F. Geometrical Progression

原题地址:http://codeforces.com/contest/758/problem/F F. Geometrical Progression time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output For given n, l and r find the number of distinct geometrical pro

Codeforces 758D Ability To Convert(区间DP)

题目链接:http://codeforces.com/problemset/problem/758/D 题意:一个n进制下的数k,其中k不会用字母,如果有A就用10代替了.求k这个数对应的,在10进制下最小的数. 分析: 本质上是把数字分成若干段使得每一段 <n 且没有前导 0 dp[i] 表示前 i 个字符划分好之后能得到的最小数. 状态枚举下一段怎么切. 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdli

codeforces 758C

codeforces 758C C. Unfair Poll introduction 一个矩形方格,从前到后,再从后到前数k次,问每个方格最多/最少经过多少次,(x,y)方格上经过多少次 method 遍历是有周期的,一个周期经过2(n-1)m个方格,当n=1时,周期为m 先求出周期,再求出剩下的次数,然后将剩下的次数,通过遍历分配到每一个方格上 tips o(1)解决问题比较困难的时候,可以向o(n)求助 Q&A conclusion 想到了周期性,但是没有处理好外层循环和内层循环的关系,

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多