hihoCoder1234 Fractal lower_bound水题

题目链接: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;
}


你可能感兴趣的:(hihoCoder1234 Fractal lower_bound水题)