51Nod - 1385 凑数字

51Nod - 1385

如果是n位数,x1 x2 x3 ... xn

从1到n的所有数中位数n-1的数字一定含有

1111...11,2222...22,...,9999...99

对于0 考虑n位数1000...00 其中有n-1个0

那么n-1位数中0-9都应该有n-1个(ans += 10*(n-1))

考虑第一位数x1需要1, 2, 3, ..., x1(ans += x1)

但是如果第一位数大于第二位数 比如21

这时2最多出现一次,以为最高位出现时,

它的下一位不能出现2, 但是如果计算ans = 2 + 10*1

显然2出现了两次,在推导发现221,2221与21情况相同,均多计算了一次

所以在单独判断x1 x1 x1 ... x1 x2 ... xn (x1 > x2)

如果符合这种情况, 那么ans要减1

综上所扯,我们可以得出代码 T U T

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int maxn = 1e5 + 10;
 6 char str[maxn];
 7 int main()
 8 {
 9     while (~scanf("%s", str)) {
10         int len = strlen(str) - 1;
11         int ans = str[0] - ‘0‘ + 10 * len;
12         if (strncmp(str, str+1, len) > 0) --ans;
13         cout << ans << endl;
14     }
15     return 0;
16 }

原文地址:https://www.cnblogs.com/zfdyf/p/9818565.html

时间: 2024-10-29 00:02:57

51Nod - 1385 凑数字的相关文章

51nod 1770 数数字

1770 数数字 基准时间限制:1 秒 空间限制:262144 KB 分值: 20 难度:3级算法题  收藏  关注 统计一下 aaa ? aaan个a × b 的结果里面有多少个数字d,a,b,d均为一位数. 样例解释: 3333333333*3=9999999999,里面有10个9. Input 多组测试数据. 第一行有一个整数T,表示测试数据的数目.(1≤T≤5000) 接下来有T行,每一行表示一组测试数据,有4个整数a,b,d,n. (1≤a,b≤9,0≤d≤

ACM学习历程—51NOD 1770数数字(循环节)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1770 这是这次BSG白山极客挑战赛的A题.由于数字全部相同,乘上b必然会有循环节,于是模拟乘法,记录数据,出现循环就退出即可. 代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring>

51nod 1132 覆盖数字的数量 V2

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1132 题意是给定a,b,l,r求[l,r]内有几个整数可以表示成ax+by(x,y为非负整数). 直接算l<=ax+by<=r会重复计算一个数的多种表示方法,而两种表示方法(x,y)总是相差k*(b,-a),因此限制y取最小值进行去重 即x>=0,y>=0,l<=ax+by<=r,y<a/gcd(a,b)五个半平面的交的整点个数,可以分类

51nod 1590 合并数字

1590 合并数字 STL - List 练习题, 直接用 List 模拟题意即可,或者手写链表也行. #include <bits/stdc++.h> using namespace std; const int N = 1e4 + 10; list<int> List[N]; int main(){ int n,x,y,y_idx,x_idx; cin >> n ; for(int i = 1;i <= n; ++i){//初始化全为 i List[i].pu

luoguP1463:反素数ant(打表心得☆)

题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数. 现在给定一个数N,你能求出不超过N的最大的反质数么? 输入输出格式 输入格式: 一个数N(1<=N<=2,000,000,000). 输出格式: 不超过N的最大的反质数. 输入输出样例 输入样例#1: 1000 输出样例#1: 840 题目 Step 1 这个是在openjudge

51Nod - 1004 n^n的末位数字

51Nod - 1004 n^n的末位数字 给出一个整数N,输出N^N(N的N次方)的十进制表示的末位数字. Input 一个数N(1 <= N <= 10^9) Output 输出N^N的末位数字 Input示例 13 Output示例 3 题解: 末尾数字,所以在快速迭代幂的时候,只需要考虑末尾数字即可. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstri

51Nod 1004 n^n的末位数字(日常复习快速幂,莫名的有毒,卡mod值)

1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给出一个整数N,输出N^N(N的N次方)的十进制表示的末位数字. Input 一个数N(1 <= N <= 10^9) Output 输出N^N的末位数字 Input示例 13 Output示例 3 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!pr

51nod 1354:选数字

51nod 1354:选数字 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1354 题目大意:有$T(T \leqslant 20)$组数据,每组给出$n(n \leqslant 1000)$个数和$K(K \leqslant 100,000,000)$,问在这$n$个数中选取若干个,积为$K$的方案数有多少. DP+离散化 与01背包类似,定义状态$dp[i][j]$为前$i$个数中选取若干个数,积为$j

51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. Input 输入N(1 <= N <= 10^9) Output 输出包含1的个数 Input示例 12 Output示例