CF399A Pages 题解

Content

有一个页面数为 \(n\) 的网站,一个人在第 \(p\) 页,那么导航页面将为如下所示:

<< p-k p-k+1 p-k+2 ... p-1 (p) p+1 ... p+k-2 p+k-1 p+k >>
  • 如果导航界面中有第一页,则不显示 <<
  • 如果导航界面中有第 \(n\) 页,则不显示 >>
  • 如果当前页码小于 \(1\) 或者大于 \(n\),则不显示导航。

按照这种要求,给定 \(n,p,k\),输出正确的导航。

数据范围:\(3\leqslant n\leqslant 100,1\leqslant p,k\leqslant n\)

Solution

这道题目就是一个很纯粹的模拟。

首先输入完判断是否有 \(p<1\) 或者 \(p>n\),如果有那就不能够输出。然而不判断这个也能过

那么判断完以后就判断左右边界,如果 \(p-k<1\),那么左边界 \(l=1\),否则 \(l=p-k\)。同样的,如果 \(p+k>n\),那么右边界 \(r=n\),否则 \(r=p+k\)

判断完左右边界后就可以直接枚举输出了,输出的时候注意,如果 \(l=1\),则不输出 <<,否则输出 <<,同样,如果 \(r=n\),则不输出 >>,否则输出 >>。还要看当前输出的位置是否是当前位置,是的话两边还要加括弧。

那么这道题目就算做完了。

Code

本题解只放核心代码部分,其中:

  • \(n,p,k\) 见题意所述。
  • \(l\) 为左边界,\(r\) 为右边界。
int l = max(p - k, 1), r = min(p + k, n);
if(p < 1 || p > n)	return 0;
if(l != 1)	printf("<< ");
for(int i = l ; i <= r; ++i) {
	if(i == p)	printf("(%d) ", i);
	else		printf("%d ", i);
}
if(r != n)	printf(">>");
posted @ 2021-12-23 20:16  Eason_AC  阅读(33)  评论(0)    收藏  举报