Loading

加载过慢可尝试刷新

【题解】洛谷 CF141B Hopscotch

洛谷题目传送门 | CF 原题传送门

思路

模拟 (比猪国杀小多了)

开始正经起来

注:本题解所说的“层数”均为总层数去掉一层的,因为第一层不在循环节内。(即 \(8\) 所在的那一层我们叫做第五层,而非第六层)

先看一个本蒟蒻画的

这道题需要先判断很多,有很多小细节需要注意: (别问我怎么知道的,看我 CF 的提交记录就知道了)

  1. 判断坐标是不是在第 \(1\) 或第 \(2\) 象限,如果不在直接输出 \(-1\)

  2. 判断 \(y\) 坐标是否在正方形边界上,如果不在直接输出 \(-1\)

  3. 特判第一层。

把以上部分预处理完毕,再来计算 \(y\) 坐标在第几层上。

然后判断层数为奇数层或层数为偶数层的情况:

层数为偶数层

首先明确,层数为偶数层时,每一层有 \(2\) 个正方形,即需要推出两个式子。

我们可以先推出在第二象限的正方形的数字:由题意得,除第一层外,每 \(3\) 个正方形为一循环,那在第二象限的正方形的数字就很好推了,就是本轮循环的最后一个数字 \(-1\)\(+1\),也就是本轮循环的最后一个数字,为:\(\frac{3n}{2}\)

那在第一象限的正方形的数字就是 \(\frac{3n}{2} +1\) 了。

知道了这些,还要特判一下 \(x\) 坐标是否在正方形内部,如果不在直接输出 \(-1\)

层数为奇数层

式子也很好推,即为 \(\lfloor \frac{n}{2} \rfloor \times 3 +2\)

也要特判 \(x\) 坐标是否在正方形内部,如果不在直接输出 \(-1\)

如果看不明白就看看代码吧。 你肯定现在已经明白了(确信)

代码

#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;
int a,x,y,n;//n为层数
int main()
{
	scanf("%d%d%d",&a,&x,&y);
	int n=y/a;//计算除第一层外的层数(总层数-1)
	if(y<=0)//不在第1或第2象限
	{
		printf("-1\n");
		return 0;
	}
	if(y%a==0)//y坐标在正方形边界上
	{
		printf("-1\n");
		return 0;
	}
	if(n==0)//特判第1层
	{
		if(y<a && abs(x)>=a/2.0)//如果不在正方形内
		{
			printf("-1\n");
			return 0;
		}
		else
		{
			printf("1\n");
			return 0;
		}
	}
	if(n%2==0)//为偶数层
	{
		if(abs(x)>=a || x==0)//x坐标在正方形外
		{
			printf("-1\n");
			return 0;
		}
		if(x<0)//在第2象限
		{
			printf("%d\n",3*n/2);
			return 0;
		}
		else//在第1象限
		{
			printf("%d\n",3*n/2+1);
			return 0;
		}
	}
	else//为奇数层
	{
		if(abs(x)>=a/2.0)//x坐标在正方形外
		{
			printf("-1\n");
			return 0;
		}
		printf("%d\n",n/2*3+2);
	}
	return 0;
}

这是本蒟蒻写的最长的一篇题解了,望管理大大通过啊

AC Record

posted @ 2022-02-11 13:29  Makerlife  阅读(47)  评论(0)    收藏  举报