Skip to content

Commit 73adba2

Browse files
committed
feat: done 2021f/lab05
Signed-off-by: Certseeds <51754303+Certseeds@users.noreply.github.com>
1 parent 070df1f commit 73adba2

42 files changed

Lines changed: 1008 additions & 90 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

algorithm/2021F/lab_02/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ Reading the samples and hints carefully can help you understand the problem.
3434
| F | 1426 |
3535
| G | 1427 |
3636

37-
A, B, E被复用, 无法获取题面
37+
1. A, B, E被复用
38+
2. A, B早有实现
39+
3. E无法测试, 故不实现

algorithm/2021F/lab_03/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ Reading the samples and hints carefully can help you understand the problem.
3434
| F | 1433 |
3535
| G | 1434 |
3636

37-
B, E, F被复用, 只有题干, 无法在contest外提交
37+
1. B, E, F被复用, 只有题干, 无法在contest外提交
38+
2. B已有实现
39+
3. E, F无法测试, 故不实现

algorithm/2021F/lab_04/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,6 @@ Score:
3030
| F | 1438 |
3131
| G | 1441 |
3232

33-
A, D, E题被复用
33+
1. A, D, E题被复用
34+
2. A, D 已有实现
35+
3. E 无法测试, 故不实现

algorithm/2021F/lab_05/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ set(CMAKE_CXX_STANDARD 11)
66
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
77

88
enable_testing()
9-
set(dependencies A B C D)
9+
set(dependencies A B C D E F G)
1010
foreach (elementName IN LISTS dependencies)
1111
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_ORDER}_${elementName})
1212
endforeach ()

algorithm/2021F/lab_05/README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Contest1099 - CS203 2021 Fall Lab 05 Stack + Queue
2+
3+
> cid: 1100
4+
5+
Welcome to CS203 2021 Fall Lab 05! Enjoy this Lab!
6+
7+
There are six problems for you to solve.
8+
9+
Score:
10+
11+
+ A: 10
12+
+ B: 15/10
13+
+ C: 15/10
14+
+ D: 20/15
15+
+ E: 20/15
16+
+ F: 20
17+
+ G: undefined/20
18+
19+
Reading the samples and hints carefully can help you understand the problem.
20+
21+
## 题目列表
22+
23+
| Problem | problem id |
24+
|--------:|-----------:|
25+
| A | 1443 |
26+
| B | 1444 |
27+
| C | 1357 |
28+
| D | 1445 |
29+
| E | 1342 |
30+
| F | 1376 |
31+
| G | 1369 |
32+
33+
1. E, F, G 均被复用, 无法测试, 故不实现
34+
2. 其余A, B, C, D均已有实现
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
problem, AC, PE, WA, TLE, MLE, OLE, RE, CE, TR, Total , C, C++, Java
2+
A, 239, 1, 537, 60, 16, 2, 341, 52, 1248, 5, 234, 1009
3+
B, 236, 502, 96, 1, 3, 113, 54, 1005, 25, 106, 874
4+
C, 250, 2, 106, 8, 3, 94, 46, 509, 31, 72, 406
5+
D, 226, 2, 574, 27, 3, 6, 54, 37, 929, 10, 202, 717
6+
E, 208, 377, 78, 138, 3, 346, 53, 1203, 3, 253, 947
7+
F, 113, 298, 332, 26, 1, 76, 37, 883, 5, 203, 675
8+
Total, 1272, 5, 2394, 601, 184, 18, 1024, 279, 5777, 79, 1070, 4628
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
problem, AC, PE, WA, TLE, MLE, OLE, RE, CE, TR, Total , C, C++, Java
2+
A, 27, 36, 1, 17, 8, 89, 1, 42, 46
3+
B, 41, 23, 6, 1, 5, 1, 77, 41, 36
4+
C, 37, 3, 1, 4, 3, 48, 25, 23
5+
D, 30, 43, 3, 1, 3, 80, 1, 34, 45
6+
E, 46, 27, 18, 16, 34, 12, 153, 1, 71, 81
7+
F, 34, 27, 34, 5, 10, 9, 119, 2, 71, 46
8+
G, 42, 50, 44, 2, 10, 3, 151, 92, 59
9+
Total, 257, 209, 106, 24, 1, 81, 39, 717, 5, 376, 336

algorithm/2021F/lab_05/lab_05_A/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ set(CMAKE_CXX_STANDARD 11)
66
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
77

88
enable_testing()
9-
add_executable(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_ORDER}_${PROBLEM_ORDER}.cpp)
9+
add_executable(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp)
1010
set(CMAKE_CXX_STANDARD 17)
11-
add_executable(${PROJECT_NAME}_test ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_ORDER}_${PROBLEM_ORDER}_test.cpp)
11+
add_executable(${PROJECT_NAME}_test ${CMAKE_CURRENT_SOURCE_DIR}/test.cpp)
1212
target_compile_definitions(${PROJECT_NAME}_test PRIVATE ALGORITHM_TEST_MACRO)
1313
target_link_libraries(${PROJECT_NAME}_test PRIVATE algorithm_template_INCLUDE)
14-
MESSAGE(STATUS "${PROJECT_NAME}_${elementName} from ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_ORDER}_${PROBLEM_ORDER}_test.cpp")
14+
MESSAGE(STATUS "${PROJECT_NAME}_${elementName} from ${CMAKE_CURRENT_SOURCE_DIR}/test.cpp")
1515
add_test(${PROJECT_NAME}_CTEST ${PROJECT_NAME}_test)
1616
set(CMAKE_CXX_STANDARD 11)
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# lab_05_A — Canteen Queue
2+
3+
## Description
4+
5+
It's lunch time now!
6+
7+
Students are queuing in a queue and each student has one specific kind of favourite food
8+
9+
The canteen offers different kinds of food in a stack
10+
11+
If the food on the top of the stack matches one's favourite food in his turn, he will take it and leave the queue.
12+
13+
Otherwise, he will go back to the end of the line to queue up again.
14+
15+
The canteen will open for $T$ time slots.
16+
17+
LowbieH now gives you the event of each time slot.
18+
19+
There are 3 types of events in total:
20+
21+
+ Event 1 : NewFood NameOfNewFood (Push new food into the stack.)
22+
+ Event 2 : NewComer NameOfFavouriteFood (A new student will join the queue with his favourite food.)
23+
+ Event 3 : TakeFood (The first student in the queue will make his choice. If the food stack is empty, he will do nothing. )
24+
25+
After $T$ time slots, the canteen will stop providing new food. The remaining students in the queue will take the food or queue again successively until the food stack is empty or nobody could get his favourite food . After that the canteen will close. Can you tell LowbieH that how many students will be left to starve when the canteen closes?
26+
27+
## Input
28+
29+
The first line contains an integer $T(0 \leq T \leq 10000)$. The following $T$ lines are the events that mentioned in the description above. The input is guaranteed to be valid.
30+
31+
## Output
32+
33+
If everyone had taken his favorite food, you should print "Qi Fei!"(without quotation marks). Otherwise, please tell LowbieH the number of the remaining hungry students.
34+
35+
## Sample Input
36+
37+
```log
38+
6
39+
NewComer SpicyHotPot
40+
NewComer BarbecuedPorkCombo
41+
NewFood BarbecuedPorkCombo
42+
TakeFood
43+
NewFood SpicyHotPot
44+
NewFood BarbecuedPorkCombo
45+
```
46+
47+
## Sample Output
48+
49+
```log
50+
Qi Fei!
51+
```
52+
53+
## 解题思路
54+
55+
### 问题分析
56+
57+
本题模拟了一个食堂打饭的场景, 涉及两种数据结构:
58+
1. **学生队列 (Queue)**: 学生排队, 符合先进先出 (FIFO) 的特性.
59+
2. **食物栈 (Stack)**: 食堂提供的食物, 符合后进先出 (LIFO) 的特性.
60+
61+
核心逻辑是:
62+
+ 队首的学生查看栈顶的食物.
63+
+ 如果食物是该学生喜欢的, 学生取走食物并离开队列.
64+
+ 如果不是, 学生回到队尾重新排队.
65+
+ 这个过程会持续进行, 直到食物栈为空, 或者队列中的所有学生都无法在当前栈顶找到自己喜欢的食物.
66+
67+
### 数据结构选择
68+
69+
根据题目描述, `main.cpp` 的实现直接使用了 C++ STL 中对应的标准容器:
70+
+ `std::queue<size_t> comer`: 用于模拟学生队列.
71+
+ `std::stack<size_t> way`: 用于模拟食物栈.
72+
73+
为了处理食物名称这种字符串类型, 代码采用 `std::hash<string>` 将字符串转换为 `size_t` 类型的哈希值进行存储和比较. 这样做可以提高比较效率, 避免了在循环中进行大量的字符串比较.
74+
75+
### 算法流程
76+
77+
1. **初始化**:
78+
+ 读取事件数量 `T`.
79+
+ 创建 `stack<size_t> way``queue<size_t> comer`.
80+
+ 使用 `std::hash<string>` 预计算 "NewFood", "NewComer", "TakeFood" 等命令的哈希值, 以便快速匹配命令.
81+
82+
2. **处理 T 个时间槽的事件**:
83+
+ 循环 `T` 次, 每次读取一个事件.
84+
+ **NewFood**: 将新食物的名称哈希后压入 `way` 栈.
85+
+ **NewComer**: 将新学生的喜爱食物名称哈希后加入 `comer` 队列.
86+
+ **TakeFood**:
87+
+ 检查食物栈 `way` 是否为空. 如果为空, 则什么都不做.
88+
+ 如果食物栈不为空, 取出队首学生 `comer.front()` 和栈顶食物 `way.top()`.
89+
+ 比较两者. 如果匹配, 则学生出队, 食物出栈.
90+
+ 如果不匹配, 学生出队后, 再重新入队, 回到队尾.
91+
92+
3. **处理剩余学生**:
93+
+`T` 个时间槽结束后, 进入一个 `while` 循环, 处理仍在队列中的学生.
94+
+ 这个循环的终止条件是: 食物栈 `way` 为空, 或者学生队列 `comer` 为空.
95+
+ 还有一个重要的终止条件: **死锁检测**. 如果队列中的所有学生都轮了一遍, 却没有一个人能取走食物, 那么就不会再有变化了, 循环必须终止.
96+
+ 代码通过一个计数器 `continue_time` 来实现死锁检测. `continue_time` 记录了连续多少个学生无法取走食物. 如果 `continue_time` 等于当前队列的长度 `comer_size`, 就意味着发生了死锁, 循环中断.
97+
+ 如果一个学生成功取走食物, `continue_time` 会被重置为 0.
98+
99+
4. **输出结果**:
100+
+ 统计总学生数和成功取走食物的学生数.
101+
+ 如果两者相等, 说明所有学生都吃到了饭, 输出 "Qi Fei!".
102+
+ 否则, 输出两者之差, 即挨饿的学生数量.
103+
104+
### 结论
105+
106+
该实现清晰地模拟了题目所描述的整个过程. 通过使用标准库中的 `queue``stack`, 代码结构简单明了. 关键点在于第二阶段处理剩余学生时的 **死锁判断**, 这是确保程序在无解情况下能够正常终止的核心.

algorithm/2021F/lab_05/lab_05_A/lab_05_A.cpp renamed to algorithm/2021F/lab_05/lab_05_A/main.cpp

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,5 @@
11
// SPDX-License-Identifier: AGPL-3.0-or-later
22
// SPDX-FileCopyrightText: 2020-2025 nanoseeds
3-
/*
4-
* @题目描述
5-
* 惧亡者排成一个队列,每个惧亡者都有一个生体转化偏好
6-
* 星神在一个栈中提供各种生体转化可能性
7-
* 如果栈顶的生体转化匹配上了惧亡者的生体转化偏好,该惧亡者将被生体转化为 太空死灵, 并从队列中移除
8-
* 否则,该惧亡者将重新进入队列尾部
9-
*
10-
* 每个时隙内,会有不同事件发生
11-
* 第一种: `NewFold ${NAME_OF_NEW_FOOD}` 生体转化堆中推入新可能性
12-
* 第二种: `NewComer ${NAME_OF_FAVORITE_FOOD}` 新的惧亡者进入队列
13-
* 第三种: `TakeFood` 队列首部惧亡者进行选择,若生体转化堆为空,则等待
14-
* 所有时隙后,星神不再提供新的生体转化可能性
15-
*
16-
* 剩余的惧亡者将进行生体转化 直到 生体转化堆 为空 或者没有惧亡者能够进行生体转化
17-
* 此时星神将会结束生体转化.
18-
*
19-
* 输出生体转化结束时多少惧亡者 还没有进行生体转化
20-
*@输入
21-
* 第一行数字 α,代表时隙数量 [0,1000]
22-
* 之后是 α行操作
23-
*@输出
24-
* 若全部都进行了,则输出 R"(Qi Fei!)"
25-
* 否则,输出数字
26-
*@样例
27-
* @输入
28-
* 6
29-
* NewComer SpicyHotPot
30-
* NewComer BarbecuedPorkCombo
31-
* NewFood BarbecuedPorkCombo
32-
* TakeFood
33-
* NewFood SpicyHotPot
34-
* NewFood BarbecuedPorkCombo
35-
* @输出
36-
* Qi Fei!
37-
* */
38-
//@Tag DONE
39-
40-
#ifndef ALGORITHM_TEST_MACRO
41-
#pragma GCC optimize(3, "Ofast", "inline", "no-stack-protector", "unroll-loops")
42-
#pragma GCC optimize("inline-small-functions")
43-
#pragma GCC optimize("-finline-small-functions")
44-
#pragma GCC target("mmx")
45-
#endif
463

474
#include <stack>
485
#include <queue>
@@ -51,7 +8,12 @@
518
#include <iostream>
529
#include <algorithm>
5310

54-
#ifdef ALGORITHM_TEST_MACRO
11+
#ifndef ALGORITHM_TEST_MACRO
12+
#pragma GCC optimize(3, "Ofast", "inline", "no-stack-protector", "unroll-loops")
13+
#pragma GCC optimize("inline-small-functions")
14+
#pragma GCC optimize("-finline-small-functions")
15+
#pragma GCC target("mmx")
16+
#else
5517
namespace lab_05_A{
5618
#endif
5719

0 commit comments

Comments
 (0)