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(">>");