好吧,这么简单地题目也就接了这么久。第一次做二分,囧,二分多好的东西啊- -
题目的意思是给出个具有等差数列性质的序列110100100010000…,再给出n个序列号,求这n个位置上的0、1值。
先把1的位置用数组确定下来,a[0]=1,a[1]=2,a[2]=4.....,
然后对给出的数进行二分查找,QuickSort。
#include <iostream>//ural 1209,zisu_123
#include <cstdio>
using namespace std;
long long a[100005];
int main()
{
long long N;
long long t=1;
long long i,k,flag;
for(i=0;;i++)
{
t+=i;
if(t>2147483647) break;
a[i]=t;
}
t=i-1;
scanf("%lld",&N);
for(i=0;i<N;i++)
{
scanf("%lld",&k);
flag=0;
long long left=0,right=t,temp;
while(left<=right)
{
temp=(left+right)/2;
if(a[temp]==k) {flag=1;printf("1\n");break;}
if(a[temp]>k) right=temp-1;
else left=temp+1;
}
if(flag==0) printf("0\n");
}
return 0;
}