uva10706 - Number Sequence(找规律)

2024-08-24 04:32

本文主要是介绍uva10706 - Number Sequence(找规律),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:uva10706 - Number Sequence(找规律)


题目大意:有这样一串序列11212312341234512345612345671234567812345678912345678910123456789101112345678910...,问第i个位置数的值。

                                                  1  2     3       4          5            6              7               ... 

解题思路:这题需要发现规律。我一开始还看错题意了。规律是看了别人的题解才明白的。

                    这里定义s【i】代表第i个序列的位置。例如上面那串序列下面标的数字就代表属于哪个序列。(1序列的位置1,3序列的位置6...)

                    num【i】代表第i个序列的长度。注意数字10长度位2.

                    递推公式: s【i】 =  s【i - 1】  + s【i - 1】 - s【i - 2】 + Wi(i的位数)。

                    求第i序列的位置,那么就要从第i - 1序列的位置开始+序列i的长度。 s【i-1】 - s【i - 2】 :i- 1序列的位置,减去i - 2序列的位置,就是i - 1序列的长度,也就是num【i - 1】。  那么只要在i - 1序列的位置加上i - 1的长度,最后i序列的长度和i - 1序列的长度差的就是 i的位数。

                  这里需要预处理数组s和num,之后的查找就是遍历这两个数组,找到相应的值。数组的大小开到1e5就可以了,已经超过2147483647了。

                  求第i个位置的值,那么就要先找到位于哪个序列。遍历s数组,找到s【k - 1】 <= i, 将i 减去s【k - 1】(k - 1序列的位置)就是i位置在k序列中的长度。

                   然后每个序列的长度也是由规律的: 序列3 :123 长度3

                                                                                       序列4:1234 长度4

                                                                                       序列i和序列i - 1相差的长度其实就是i的位数,而且又是递增的。

                   在num数组里面找到num【k - 1】 >= i <=num[k],那么意味着i的值就是k位数里的其中一个。


代码:

#include <stdio.h>
#include <math.h>typedef long long ll;
const ll N = 2147483647;
const int w[] = {0, 10, 100, 1000, 10000, 100000};    //(0位1位2位...)位数分界值
const int M = 100000;
ll s[M];
ll num[M];
//预处理
void init () {s[0] = num[0] = 0;s[1] = num[1] = 1;int cur = 1;for (int i = 2; s[i - 1] < N; i++) {if (i >= w[cur]) cur++;s[i] = 2 * s[i - 1] - s[i - 2] + cur;num[i] = s[i] - s[i - 1];}
}int main () {init();int t;ll n;scanf ("%d", &t);char str[10];while (t--) {scanf ("%lld", &n);int i;for (i = 1; i < M ; i++)if (s[i] >= n)break;n -= s[i - 1];for (i = 1; i < M; i++)if (num[i] >= n)break;n -= num[i - 1];	sprintf (str, "%d", i);printf ("%c\n", str[n - 1]);}return 0;
}




这篇关于uva10706 - Number Sequence(找规律)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101452

相关文章

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置版本号生成 打开项目配置页面。在下方找到 “Build Env

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

【UVA】1626-Brackets sequence(动态规划)

一道算是比较难理解的动规。 状态转移分2个: (用d[i][j]表示在i~j内最少需要添加几个括号,保持平衡) 1.如果s[i]和s[j]是一对括号,那么d[i][j] = d[i + 1][j - 1] 2.否则的话 d[i][j] = min(d[i][k],[k + 1][j]); 边界是d[i + 1][i] = 0; d[i][i] = 1; 13993644 162

【Hdu】Minimum Inversion Number(逆序,线段树)

利用线段树在nlogn的时间复杂度内求一段数的逆序。 由于给的序列是由0 ~ n -1组成的,求出初始的逆序之后可以递推出移动之后的逆序数。 #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const in

【UVA】10534 - Wavio Sequence(LIS最长上升子序列)

这题一看10000的数据量就知道必须用nlog(n)的时间复杂度。 所以特意去看了最长上升子序列的nlog(n)的算法。 如果有2个位置,该位置上的元素为A[i]和A[j],并且他们满足以下条件: 1.dp[i] = dp[j]    (dp[x]代表以x结尾的最长上升子序列长度) 2.A[i] < A[j] 3.i < j 那么毫无疑问,选择dp[i] 一定优于选择dp[j] 那么

【JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

基本数据类型   JavaScript基本数据类型包括:undefined、null、number、boolean、string。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值。 1)基本数据类型的值是不可变的 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = "change";name.substr();//hangconsole.log