CF475A Bayan Bus 题解
Update
- \(\texttt{2020.10.6}\) 修改了一些笔误。
Content
模拟一个核载 \(34\) 人的巴士上有 \(k\) 个人时的巴士的状态。
每个人都会优先选择有空位的最后一排最左侧一个空位入座。
数据范围:\(0\leqslant k\leqslant 34\)。
Solution
有 \(6\) 行,所以按 \(6\) 行来分类讨论。
Part 1 第一行
第一行只需要输出一串字符串就行了,不需要多讲。
由于第六行输出的东西和第一行一模一样,故之后不做详细讲解。
Part 2 第二行
第二行开始一直到第五行都需要考虑到车上的人的情况。我们先来看这一行。
首先得要考虑最后一排的情况(因为最后一排有 \(4\) 个人)。
- 如果 \(k=0\),那么最后一排上的这一列不坐人。
- 否则,这里肯定会坐人。
然后,还有坐在这一列的人数 \(p_2=\left\lceil\dfrac{\max\{0,k-4\}}{3}\right\rceil\),没坐在这一列的人数则是 \(10-p_2\)。这个可以自己去推算。
Part 3 第三行
首先还是考虑最后一排的情况。
- 如果 \(k<2\),那么这里不坐人。
- 否则,这里肯定坐人。
然后,还有坐在这一列的人数 \(p_3=\left\lceil\dfrac{\max\{0,k-5\}}{3}\right\rceil\),没坐在这一列的人数则是 \(10-p_3\)。
由于第五行与第二、三行的情况类似,故之后不做详细讲解。
Part 4 第四行
首先还是考虑最后一排的情况。
- 如果 \(k<3\),那么这里不坐人。
- 否则,这里肯定坐人。
然后这里就是过道了,直接输出 .(经检验总共有 \(22\) 个)。
其他的不做多讲。
注意,除了我讲的东西要输出外,每一行后面可能还会有一些多余的东西,它们也要输出。
Code
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
int k;
scanf("%d", &k);
printf("+------------------------+\n|");
if(!k) printf("#.");
else printf("O.");
for(int i = 1; i <= (int)ceil(max(0, k - 4) / 3.0); ++i) printf("O.");
for(int i = 1; i <= 10 - (int)ceil(max(0, k - 4) / 3.0); ++i) printf("#.");
printf("|D|)\n|");
if(k < 2) printf("#.");
else printf("O.");
for(int i = 1; i <= (int)ceil(max(0, k - 5) / 3.0); ++i) printf("O.");
for(int i = 1; i <= 10 - (int)ceil(max(0, k - 5) / 3.0); ++i) printf("#.");
printf("|.|\n|");
if(k < 3) printf("#.");
else printf("O.");
for(int i = 1; i <= 22; ++i) printf(".");
printf("|\n|");
if(k < 4) printf("#.");
else printf("O.");
for(int i = 1; i <= (int)ceil(max(0, k - 6) / 3.0); ++i) printf("O.");
for(int i = 1; i <= 10 - (int)ceil(max(0, k - 6) / 3.0); ++i) printf("#.");
printf("|.|)\n+------------------------+");
}

浙公网安备 33010602011771号