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+------------------------+");
}
posted @ 2021-12-21 20:18  Eason_AC  阅读(38)  评论(0)    收藏  举报