P1895 数字序列

题目背景

查找数字

题目描述

在下列的无穷数字序列1121231234123451234561234567123456781234567891234567 8910123456789101112345678910......中,查找第i个数字。

输入格式

第一行为正整数t(1≤t≤10),表示测试数据组数。接下来t行,每行一个正整数i(1≤i≤2^31-1)。

输出格式

对于每一个i,输出对应位置上的数字。

输入输出样例

输入 #1

2
3
8

输出 #1

2
2

思路

预处理不必拆开每个数,只要像LCA一样对整十数(10,100,1000......)记录即可

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=40010;

int p=1,t,n;
int a[N],lis[N];

int main() {
	for(int i=1; i<=40000; i++) {
		a[i]=a[i-1];
		if(i==p) {
			a[i]++;
			p*=10;
		}
	}
	for(int i=1; i<=40000; i++)
		lis[i]=lis[i-1]+a[i];
	scanf("%d",&t);
	while(t--) {
		scanf("%d",&n);
		for(int i=1; n>lis[i]; i++)
			n-=lis[i];
		int top=1;
		while(n>a[top])
			n-=a[top++];
		int ans[10];
		for(int i=a[top]; i; i--) {
			ans[i]=top%10;
			top/=10;
		}
		printf("%d\n",ans[n]);
	}
	return 0;
}

原文地址:https://www.cnblogs.com/mysh/p/11380658.html

时间: 2024-08-04 15:10:06

P1895 数字序列的相关文章

BZOJ 1049 数字序列(LIS)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1049 题意:给出一个数列A,要求:(1)修改最少的数字使得数列严格递增:(2)在(1)的基础上使得修改的绝对值之和最小. 思路:对于第一问看起来像是求最长上升子 列,其实不是.我们想,若对于i<j,j能由i转移过来,那么需满足A[j]-A[i]>=j-i才行,这样我们发现只要A[j]-j& gt;=A[i]-i即可.因此令A[i]=A[i]-i,这样求LIS即可.对于第二问,

生成数字序列命令(7)

生成数字序列命令:seq,shuf 7.1.seq 功能:打印数字序列 语法:seq [OPTION]... LAST seq [OPTION]... FIRST LAST seq [OPTION]... FIRST INCREMENT LAST 常用选项: -f  使用printf样式格式 -s  指定分隔符,默认换行符\n -w  等宽,用0填充 示例: 数字序列: 方法1: [[email protected] ~]# seq 10 1 2 3 4 5 6 7 8 9 10 方法2: fo

笔试算法题(34):从数字序列中寻找仅出现一次的数字 &amp; 最大公约数(GCD)问题

出题:给定一个数字序列,其中每个数字最多出现两次,只有一个数字仅出现了一次,如何快速找出其中仅出现了一次的数字: 分析: 由于知道一个数字异或操作它本身(X^X=0)都为0,而任何数字异或操作0都为它本身,所以当所有的数字序列都异或操作之后,所有出现两次的数字异或操作之后的结果都为0,则最后剩下的结果就是那个仅出现了一次的数字: 如果有多个数字都仅仅出现了一次,则上述的异或操作方法不再适用:如果确定只有两个数字只出现了一次,则可以利用X+Y=a和XY=b求解: 解题: 1 int findSin

求一组数字序列的分布情况(java)

最近需要做一个正态分布的函数图像所以要处理一段double序列 写了这个算法  先上效果图: 核心思想: 1先根据步长计算每一个区间 2循环进行判断序列中每个数属于哪个区间 3用一个数组来保存每一个区间中 数的个数 这样就可以得到整个分布函数了 当然效率值得考虑 我的机器1百万以上的数据就会有问题了 这是一个double类型的例子 int型就更容易啦 上代码! 1 package com.huang.distribution; 2 3 import java.math.BigDecimal; 4

codevs 2622 数字序列

2622 数字序列 提交地址:http://codevs.cn/problem/2622/ 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定一个长度为n的一个序列A1,A2,…,An,求序列中连续子序列的最大和. 例如:当输入为-5,3,5,7,-15,6,9,27,-36,10时,连续子序列6,9,27的和为42是最大值:而当序列变成-5,3,5,8,-15,6,9,27,-36,10时,连续子序列3,5,8,-15,6,9

【BZOJ 1049】 [HAOI2006]数字序列

1049: [HAOI2006]数字序列 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 979  Solved: 389 [Submit][Status] Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个数n,接下来n个整数按顺序描述每一项的键值. Output 第一行一个整数表示最少需要改变多少

[Jobdu] 题目1544:数字序列区间最小值

题目描述: 给定一个数字序列,查询任意给定区间内数字的最小值. 输入: 输入包含多组测试用例,每组测试用例的开头为一个整数n(1<=n<=100000),代表数字序列的长度.接下去一行给出n个数字,代表数字序列.数字在int范围内.下一行为一个整数t(1<=t<=10000),代表查询的次数.最后t行,每行给出一个查询,由两个整数表示l.r(1<=l<=r<=n). 输出: 对于每个查询,输出区间[l,r]内的最小值. 样例输入: 5 3 2 1 4 3 3 1

找出数组中最长的连续数字序列(JavaScript实现)

原始题目: 给定一个无序的整数序列, 找最长的连续数字序列. 例如: 给定[100, 4, 200, 1, 3, 2], 最长的连续数字序列是[1, 2, 3, 4]. 小菜给出的解法: 1 function maxSequence(array,step){ 2 var _array = array.slice(), //clone array 3 _step = 1, 4 _arrayTemp = [], 5 i = 0; 6 7 var parseLogic = { 8 //result c

【BZOJ】【1049】【HAOI2006】数字序列

DP 第一问比较水……a[i]-=i 以后就变成最长不下降子序列问题了,第二问这个结论好神奇,考试的时候怎么破?大胆猜想,不用证明?TAT 题解:http://pan.baidu.com/share/link?uk=2651016602&shareid=1490516411 没有将a[0]置为-INF在BZOJ上WA了……so sad…… 1 /************************************************************** 2 Problem: 10