博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-1019 Number Sequence 二分查找
阅读量:6278 次
发布时间:2019-06-22

本文共 1353 字,大约阅读时间需要 4 分钟。

这题只需要预处理两个数组就可以了,那就是一个保留从1到N,这个N个数字连在一起的长度,以及另外一个数组表示重复打印112123...123..N的这样一个打印到N的串的长度。接下来进行两次二分查找便可得到答案了。

代码如下:

#include 
#include
#include
#define MAXN 32000using namespace std;typedef long long int Int64;Int64 N, c[MAXN+5], s[MAXN+5];inline int Len(int x){ int ret = 0; while (x) { ++ret; x /= 10; } return ret;}void pre(){ for (int i = 1; i <= MAXN; ++i) { c[i] = c[i-1] + Len(i); } for (int i = 1; i <= MAXN; ++i) { s[i] = s[i-1] + c[i]; }}int bsearch(int l, int r, Int64 x[]){ int mid, ret; while (l <= r) { mid = (l + r) >> 1; if (x[mid] >= N) { r = mid - 1; ret = mid; } else { l = mid + 1; } } return ret;}int main(){ pre(); int pos, cnt, t, T; scanf("%d", &T); while (T--) { scanf("%I64d", &N); pos = bsearch(1, MAXN, s); N -= s[pos-1]; // 表示还剩余的位数 pos = bsearch(1, MAXN, c); if (c[pos] == N) { printf("%d\n", pos % 10); } else { cnt = 0; N = c[pos]-N; while (pos) { ++cnt; if (cnt == N+1) { printf("%d\n", pos % 10); } pos /= 10; } } } return 0; }

转载地址:http://ibyva.baihongyu.com/

你可能感兴趣的文章
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>