紫书 例题 10-22 UVa 1640(数位统计)
这道题的题解有几个亮点
一个是每次只统计一个数字来简化思维
一个是统计当前位数的时候分三个部分来更新答案
具体看代码,有注释
#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 10;
int pow[MAXN], cnt[MAXN];
int f(int d, int n) //分单个数字来统计,简化了思维过程
{
char s[MAXN];
sprintf(s, "%d", n);
int len = strlen(s), ans = 0;
REP(i, 1, len) //如果是四位数,那么一,二,三位数的数字的个数可以直接统计,以此类推
{
if(i == 1) ans++;
else
{
ans += 9 * cnt[i-1];
if(d > 0) ans += pow[i-1]; //注意首位要单独出来统计
}
}
int pre[10]; //前i位数d出现的次数
REP(i, 0, len)
{
pre[i] = s[i] - '0' == d ? 1 : 0;
if(i > 0) pre[i] += pre[i-1];
}
REP(i, 0, len)
{
int maxd = s[i] - '0';
int mind = (i == 0 && len > 1); //首位不为0,只有0除外
REP(digit, mind, maxd)
{
ans += cnt[len-i-1]; //当前位数的后面的数
if(i > 0) ans += pre[i-1] * pow[len-i-1]; //当前位数的前面的数
if(digit == d) ans += pow[len-i-1]; //当前位数
}
}
return ans;
}
int main()
{
pow[0] = 1;
REP(i, 1, 9)
{
pow[i] = pow[i-1] * 10; //10的i次方
cnt[i] = pow[i-1] * i; //i位数中每个数字出现的次数(0可以为首位)
}
int a, b;
while(~scanf("%d%d", &a, &b) && a)
{
if(a > b) swap(a, b);
REP(d, 0, 10)
{
if(d) printf(" ");
printf("%d", f(d, b + 1) - f(d, a));
}
puts("");
}
return 0;
}
紫书 例题 10-22 UVa 1640(数位统计)的更多相关文章
- 紫书 例题 11-13 UVa 10735(混合图的欧拉回路)(最大流)
这道题写了两个多小时-- 首先讲一下怎么建模 我们的目的是让所有点的出度等于入度 那么我们可以把点分为两部分, 一部分出度大于入度, 一部分入度大于出度 那么显然, 按照书里的思路,将边方向后,就相当 ...
- 紫书 例题 9-5 UVa 12563 ( 01背包变形)
总的来说就是价值为1,时间因物品而变,同时注意要刚好取到的01背包 (1)时间方面.按照题意,每首歌的时间最多为t + w - 1,这里要注意. 同时记得最后要加入时间为678的一首歌曲 (2)这里因 ...
- 紫书 例题8-3 UVa 1152(中途相遇法)
这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ...
- 紫书 例题8-12 UVa 12627 (找规律 + 递归)
紫书上有很明显的笔误, 公式写错了.g(k, i)的那个公式应该加上c(k-1)而不是c(k).如果加上c(k-1)那就是这一次 所有的红气球的数目, 肯定大于最下面i行的红气球数 我用的是f的公式, ...
- 紫书 例题8-4 UVa 11134(问题分解 + 贪心)
这道题目可以把问题分解, 因为x坐标和y坐标的答案之间没有联系, 所以可以单独求两个坐标的答案 我一开始想的是按照左区间从小到大, 相同的时候从右区间从小到大排序, 然后WA 去uDebug找了数据 ...
- 紫书 例题8-17 UVa 1609 (构造法)(详细注释)
这道题用构造法, 就是自己依据题目想出一种可以得到解的方法, 没有什么规律可言, 只能根据题目本身来思考. 这道题的构造法比较复杂, 不知道刘汝佳是怎么想出来的, 我想的话肯定想不到. 具体思路紫书上 ...
- 紫书 例题7-14 UVa 1602(搜索+STL+打表)
这道题想了很久不知道怎么设置状态,怎么拓展,怎么判重, 最后看了这哥们的博客 终于明白了. https://blog.csdn.net/u014800748/article/details/47400 ...
- 紫书 例题8-10 UVa 714 (二分答案)
这道题让最大值最小, 显然是二分答案 当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案 为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点 就全部枚举一遍, 验证答案 ...
- 紫书 例题8-7 UVa 11572(滑动窗口)
滑动窗口这个方法名字非常形象, 先是窗口的右指针尽量往右滑, 滑不动了就滑窗口的左指针, 滑到右指针又可以开始滑动为止. 这道题是要记录滑的过程中最大的窗口长度, 限制条件是窗口中不能出现重复的值. ...
随机推荐
- gb2312和gbk互转
String deStr = System.Web.HttpUtility.UrlEncode("欢迎", Encoding.GetEncoding("GBK" ...
- django steps EASY WAY
django 2.0 python 3.6 =========django steps EASY WAY=========== reference: https://djangoforbeginner ...
- 贰、js的基础(一)
1.js的语法 a.区分大小写 b.弱类型变量:变量无特定类型 c.每行结尾的分号可有可无 d.括号用于代码块 e.注释的方法与c语言和java相同 2.变量 注意事项: a.通过关键字var来声明. ...
- 在远程X server上显示图形的设置方法
1.在服务器的/etc/ssh/sshd_config中,设置X11Forwarding yes,然后重启ssh服务,cd /etc/init.d这个目录下执行 ./ssh restart 2.在客户 ...
- 查看Linux 服务器是 32位还是64位的
查看Linux 服务器是 32位还是64位的 getconf LONG_BIT 返回 64 代表就是 64位的: 返回 32 代表就是 32位的:
- JDBC读写MySQL的大字段数据
JDBC读写MySQL的大字段数据 不管你是新手还是老手,大字段数据的操作常常令你感到很头痛.因为大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式 来处理的.而非一般的字段 ...
- LVM 镜像硬盘更换、数据恢复(centos7.4 redhat7.5)
案例说明 Centos7 VG:vg LV:vg-lvRedhat 7.5VG:vgtest LV:lvtest 目的:模拟硬盘 /dev/sdb损坏.在线添加新硬盘/dev/sdc,lv镜像数据 ...
- iOS:界面上下空出黑条
启动图没有加入完整造成
- hdu 5318 The Goddess Of The Moon 矩阵高速幂
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5318 The Goddess Of The Moon Time Limit: 6000/3000 MS ( ...
- OCP-1Z0-051-题目解析-第50题
50. SLS is a private synonym for the SH.SALES table. The user SH issues the following command: DRO ...