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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章