题目链接:http://hihocoder.com/problemset/problem/1234
题目大意:给以一个边长为1的正方形,以该正方形各边的中点为顶点做出一个小正方形,以此类推,画出1000个正方形,现在给出一条平行于y轴的直线x=k(k∈[ 0,0.5 ]),问x=k和上述图形有多少个交点。
分析:很明显,对于某一区间,其交点的个数是一样的,我们只需打出这些所有可能的值,然后对输入的k进行判断,根据其所在的区间输出相应的值即可。不难发现:
对于区间(0.5-0.5, 0.5-0.5^2),其交点个数为4=4*1;
对于区间(0.5-0.5^2, 0.5-0.5^3) 其交点个数为8=4*2;
对于区间(0.5-0.5^k, 0.5-0.5^k+1) 其交点个数为n=4*k;
对于区间的边界,有无穷多个交点,输出-1;
1000个正方形有500个边界,我们只需存下这500个边界值即可,对于输入的k,判断他在哪个区间可以用STL中的lower_bound()来实现。
实现代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
double a[505];
void init()
{
double cnt=0.5;
for(int i=0;i<504;i++)
{
a[i]=0.5-cnt;
cnt*=0.5;
}
}
int main()
{
int t;
double k;
init();
scanf("%d",&t);
while(t--)
{
scanf("%lf",&k);
int pos=lower_bound(a,a+505,k)-a;
if(a[pos]==k) puts("-1");
else printf("%d\n",4*pos);
}
return 0;
}