poj 1019 Number Sequence(dp+二分)
来源:互联网 发布:null==NaN js 编辑:程序博客网 时间:2024/04/29 04:24
Number Sequence
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 33439 Accepted: 9559
Description
A single positive integer i is given. Write a program to find the digit located in the position i in the sequence of number groups S1S2...Sk. Each group Sk consists of a sequence of positive integer numbers ranging from 1 to k, written one after another.
For example, the first 80 digits of the sequence are as follows:
11212312341234512345612345671234567812345678912345678910123456789101112345678910
For example, the first 80 digits of the sequence are as follows:
11212312341234512345612345671234567812345678912345678910123456789101112345678910
Input
83
Sample Output
22
Source
Tehran 2002, First Iran Nationwide Internet Programming Contest
链接:http://poj.org/problem?id=1019
【题意】数列:112123123412345123456123456712345678123456789123456789101234567891011123456789101112......
求第i位的数字
【思路】
1.打表。求出子数列1-数x(1,2,3...)包含数字的个数,求出整个数列1-数x(1,2,3...)包含数字的个数;
2.根据 i 求出i所在的子数列(1-x),再求出第i位所在的数y,再求出数字ans;
【代码】
#include<cstdio>#include<iostream>using namespace std;long long dp[100000];//测出最大是31268long long sum[100000];int r;int get(long long x){ int ans=0; while(x) { ++ans; x=x/10; } return ans;}void innit(){ int i; dp[0]=0; sum[0]=0; for(int i=1;1;i++) { dp[i]=dp[i-1]+get(i); sum[i]=sum[i-1]+dp[i]; //if(i==9||i==99||i==999||i==9999||i==99999||i==999999) //cout<<sum[i]<<ends; if(sum[i]>=2147483647) { r=i; //cout<<r; break; } }}int main(){ innit(); int n,c; scanf("%d",&c); while(c--) { scanf("%d",&n); int left=1,right=r; while(left<right) { int mid=(left+right)/2; if(sum[mid]<n) left=mid+1; else right=mid; } n=n-sum[left-1]; right=left; left=1; while(left<right) { int mid=(left+right)/2; if(dp[mid]<n) left=mid+1; else right=mid; } n=n-dp[left-1]; int num[10],lenth=dp[left]-dp[left-1]; for(int i=1;i<=lenth;i++) { num[lenth-i+1]=left%10; left=left/10; } cout<<num[n]<<endl; } return 0;}
0 0
- poj 1019 Number Sequence(dp+二分)
- poj 1019 Number Sequence , 二分
- poj 1019 Number Sequence 二分
- 模拟+二分 poj-1019-Number Sequence
- POJ 1019:Number Sequence 二分查找
- poj 1019 Number Sequence 打表二分
- POJ 1019Number Sequence(DP?)
- POJ 1019 Number Sequence (二分查找+暴力打表)
- poj 1019 Number Sequence(打表+二分)
- POJ 1019 Number Sequence
- POJ 1019 Number Sequence
- poj 1019 Number Sequence
- poj 1019 Number Sequence
- POJ 1019 Number Sequence
- poj 1019 Number Sequence
- POJ-1019 Number Sequence
- POJ 1019 Number Sequence
- poj 1019 Number Sequence
- 算法学习:按指定字母顺序对单词进行排序
- leetcode之Two Sum
- 三角函数和向量
- 初始设计模式2——单例模式
- Linux下时间/时区的设置
- poj 1019 Number Sequence(dp+二分)
- 为经典版eclipse增加web and JavaEE插件
- Java实现简单的网络爬虫
- 计算机网络的威胁与保密技术
- LeetCode | LRU Cache
- (黑马程序员)学习笔记,网络编程UDP
- swift的代码教程-ios文件管理类(FileOp)
- c++栈和队列
- 如何才能找回在可移动磁盘中删除的文件