UVA 11038 - How Many O's?(计数问题)

题目链接:11038 - How Many O‘s?

题意:求[a.b]之间,0出现的次数。

思路:一开始一直往数位DP上去想,结果发现挺复杂的。。

把问题先转化为求0 - num的个数,在用到b的个数减去到a的个数

其实只要利用计数的乘法和加法原理,把数字对应的每一位的分成左右两边,利用乘法原理求总数,在用加法原理把所有的总数加起来就是总情况数。那么讨论一下分成两边的情况。举个例子

比如23045

设中间位为mid,如果mid不为0,假如求到4这个位,那么左边的情况就有[1-230]种情况,而右边则有[0 - 9]种情况,再如果求到3这个位,左边就有[1- 2]种,右边有[0 - 999]种,因为右边不管怎么取都不会超过数字。

如果mid为0,那么左边取[1-22]时,右边可以随便取为[1-100],如果左边取23,右边只能取[0-45]。这样总情况由低位一直往高位去计算就能算出来了

代码:

#include <stdio.h>
#include <string.h>

long long a, b;

long long solve(long long left) {
	if (left < 0) return 0;
	long long ans = 1, mid, right = 0, j = 1;
	while (left >= 10) {
		mid = left % 10; left /= 10;
		if (mid) ans += left * j;
		else ans += (left - 1) * j + right + 1;
		right = right + mid * j;
		j *= 10;
  	}
  	return ans;
}

int main() {
	while (~scanf("%lld%lld", &a, &b) && a != -1 || b != -1) {
		printf("%lld\n", solve(b) - solve(a - 1));
 	}
	return 0;
}

UVA 11038 - How Many O's?(计数问题),布布扣,bubuko.com

UVA 11038 - How Many O's?(计数问题)

时间: 2024-08-06 13:44:12

UVA 11038 - How Many O's?(计数问题)的相关文章

uva 11038 - How Many O&#39;s?(计数问题)

题目链接:uva 11038 - How Many O's? 题目大意:写出m到n之间的数,问需要写多少个0. 解题思路:f(x)表示从0到x需要写多少个0,于是给出区间[m,n]就有答案等于f(n)-f(m-1).剩下的就是f(x)该如何求.枚举每个位置上可能为0的情况,这样就将这个数分成两个部分,在保证组成的数小于x的前提下,计算可以的组成方法. 例:x=12345,枚举十位为0的情况,因为x的十位为4,所以十位以前的百位.千位.万位组成的数可以是0~123,然后个位可以是0~9,这样组成的

UVA 12123 - Magnetic Train Tracks(计数问题)

题目链接:12123 - Magnetic Train Tracks 题意:给定n个点,求有几个锐角三角形. 思路:和UVA 11529是同类的题,枚举一个做原点,然后剩下点根据这个原点进行极角排序,然后利用two pointer去遍历一遍,找出角度小于90度的锐角,然后扣掉这些得到钝角三角形的个数,然后在用总情况去扣掉钝角就是锐角或直角 代码: #include <stdio.h> #include <string.h> #include <math.h> #incl

UVA 1073 - Glenbow Museum(数论+计数问题+递推)

题目链接:1073 - Glenbow Museum 白书上的例题,需要一定的推理. 首先要把问题转化,推理出n个点,R的个数为(n + 4) / 2, O的个数为(n - 4) / 2个,因为首先四个角必须为R,然后在中间添加O点,每有一个O点就要多一个R点,所以最后R点比O点多4. 然后问题就转化为给定n个R点和m个O点,求出有多少个序列,要求O点不连续,并且R的连续个数不能超过4,的序列个数. 可以设状态dp[i][j][2][2],表示用到第i个R点第j个O点,开头点,结尾点,的情况种数

UVA 11401 - Triangle Counting(数论+计数问题)

题目链接:11401 - Triangle Counting 题意:有1,2,3....n的边,求最多能组成的三角形个数. 思路:利用三角形不等式,设最大边为x,那么y + z > x 得 x - y < z < x 然后y取取值,可以从1取到x - 1,y为n时候,有n - 1个解,那么总和为0 + 1 + 2 +...+ (x - 2) = (x - 1) * ( x- 2) / 2; 然后扣除掉重复的y = z的情况,在y > x / 2时,每个y取值会出现一次y = z.

UVA - 11038 How Many O&#39;s? (计数)

Description Problem E: How many 0's? A Benedict monk No. 16 writes down the decimal representations of all natural numbers between and including m and n, m ≤ n. How many 0's will he write down? Input consists of a sequence of lines. Each line contain

UVA 11529 - Strange Tax Calculation(计数问题)

题目链接:11529 - Strange Tax Calculation 题意:平面上n个建筑物,3个建筑物可以组成一个三角形,计算平均每个三角形内有多少个点 思路:问题等价于,求凹四边形的占所有四边形的比例,用O(n^2)的算法,跟 HDU 3629 Convex 这题是一个道理 代码: #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using n

UVA 11038 - How Many O&#39;s? 计算对答案的贡献

题意: 求[n, m]之间包含0的数字的个数题解:转化为求solve(n) - solve(m-1)的前缀问题 对于求0到n的解,我们举例 n = 25789 对于8这位,让其为0对答案的贡献是 (0~257)*(0~9) 假设是 n = 25709 那么让这位为0的答案贡献是 (0~256) * (0~9) + (257)* (0~9) //meek///#include<bits/stdc++.h> #include <cstdio> #include <cmath>

UVA 10253 - Series-Parallel Networks(数论+计数问题+递推)

题目链接:10253 - Series-Parallel Networks 白书的例题. 这题也是需要把问题进行转化,一个并联可以分为几个串联,然后串联可以分成边. 如此一来,最后叶子结点种数会是n,问题转化为去分配叶子结点,使得总和为n. 书上有两种方法,一种直接去递归,利用组合数学的方式去计算答案. 一种是推出递推式: 设dp[i][j]为一共j个叶子结点的树,子树的叶子最多的为i个的情况.然后对于一颗树,枚举恰好包含i个叶子的子树为p棵,那么相当于从f[i]颗树中选出p棵树的方案数,是可重

UVA 12508 - Triangles in the Grid(计数问题)

今天做作业连了一天的mysql. 最后我痛定思痛,决定从0开始学习jsp,省的又面临不会的局面. 忙活了一晚上,终于把数据库连接上了,不过,好伤心啊,我连个数据库都这么墨迹... <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="data.database"%> <%@page