CodeForces 141B Hopscotch

传送门:CF141B Hopscotch
算法分析:

  1. 判断是否在边界上(\(a|y\)),是否在第一、二象限(\(y>0\))
  2. 接着,判断 \(y\) 是否比 \(a\) 小,\(x\)是否在第一个正方形内
  3. \(y\)减去\(a\)(删去第一层),\(dir=\frac{y}{2a}+1\) 表示其所在的层数
  4. 然后就可以得到当前可能位置下的个数 \(bottom=(dir-1)*3+2\) ,并把可能位置以下的层数减去
  5. 最后再做一遍第一步的判断

时间复杂度:\(O(1)\)


#include<iostream>
#include<cstdio>
using namespace std;
int a,y; double x;
void work();
int main()
{
    cin>>a>>x>>y;
    if(y%a==0 || y<=0) printf("-1");
    else work();
    return 0;
}
void work()
{
    if(y>0 && y<a && x>-a*1.0/2 && x<a*1.0/2)
        {printf("1"); return;}
    y-=a;
    int dir=y/(2*a)+1;
    int bottom=(dir-1)*3+2;
    y-=(dir-1)*2*a;
    if(y>0 && y<a)
        if(x>-a*1.0/2 && x<a*1.0/2)
        {
            printf("%d",bottom); return;
        }
    if(y>a && y<a*2)
    {
        if(x==0) {printf("-1"); return;}
        if(x>-a && x<0)
        {
            printf("%d",bottom+1); return;
        }
        else
            if(x>0 && x<a)
            {
                printf("%d",bottom+2); return;
            }
    }
    printf("-1");
}
posted @ 2019-02-10 16:01  常青藤的花语  阅读(202)  评论(0编辑  收藏  举报

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。