·timus 1209. 1, 10, 100, 1000... URAL 解题报告
今天被这个难度为五十的题难住了,就是将1,10,100,1000…… 组成一个新的串,然后又n个询问,询问第k个位置是0还是1…… n 6W+ k10^9
但是预处理1的位置,我用map做的,因为数组开不了那么大,但是还吃超时,很郁闷,我自己手动计算了下时间预处理的时间是80+ms,但貌似是URAL的题数据都是分开测试的…… 每次都要运行下预处理…… 没办法,超时啊……
后来看到网上有阶梯报告说是推出1的位置的特点,看能否直接解出来!
另一种方法将1的下标放到数组里面,这样虽然不能用小标直接定位法,但是却可以利用二分来解决,但是实际处理的时候还是遇到点小麻烦,因用scanf("%lld")读float的时候总是在本地机上好好的,但是一旦提交就OutPut
limit exceeded ,后来在网上找到类似的错误,但是没给解释……
当然这个题如果用hash直接定位地址也很好……可惜不会用
本体解决参考的博客:
#include <iostream>//ural 1209
#include <cstdio>
#include<map>
#include<algorithm>
using namespace std;
long long a[10000005];
const int m=10000005;
int main()
{
int N;
long long t=1;
int i,k,flag;
for(i=0;;i++)
{
t+=i;
if(t>2147483647||t<0) break;
a[i]=t;
}
t=i-1;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&k);
flag=0;
long long left=0,right=t,temp;
int tmp=(upper_bound(a,a+t+1,k)-a);//
//int tmp2=(upper_bound(a,a+N,k-1)-a);//
if(a[tmp-1]==k)cout<<1<<'\n';
else cout<<0<<'\n';
}
return 0;
}
另一种方法是,a1=1 a2=a1+1,a3=a2+2,a4=a3+3……an=an-1+n-1 然后an=k ,对于给定的k,那么第k位时1的话肯定能解出一个整数n…… 判断是不是整数n就好了……