timus 1209. 1, 10, 100, 1000... URAL 解题报告

·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就好了……


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值