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