目录
前言
今天给大家介绍的题目是蓝桥杯模拟题--扫把扶不扶。
大家有什么更好的思路,可以分享在评论区。
问题描述
你正在参加一场程序员的终极面试,和你竞争的是小蓝。你们都顺利地通过了前几轮筛选,来到了最后一轮的现场面试环节。
你到达公司门口的时间是 S1,和面试官约定的面试时间是 S2。在约定时间到达前(S1 ~ S2),你可以选择提前开始面试。然而,如果超过了面试时间,即便只晚了1秒,你都将失去面试机会,直接被淘汰。
你的面试会持续T分钟。
小蓝到达公司门口的时间是S3,和面试官约定的面试时间是S4。由于你在前几轮的表现比他好,因此小蓝必须在你结束面试后才能开始他的面试。如果小蓝在他的面试时间之前没有开始面试,他也将失去面试机会,直接被淘汰。
面试存在竞争机制:如果只有你或小蓝中的一人参与了面试那么参与面试的那个人将胜出。如果你和小蓝都没有参与面试,你们将双双失败。
“那如果两个人都参与了面试,谁将胜出呢?”你正想着,突然发现公司门口的不远处躺着一把扫把,看样子是面试官故意放的。你想扶起它,但这需要你花费x分钟的时间。根据你所了解的套路,如果你扶起了扫把,并参加了面试,那么你和小蓝的竞争中,你必定能够胜出。相对的,如果你没有扶起扫把,并且你和小蓝都参加了面试,那么小蓝必定能够胜出。现在,你和小蓝都会采取最优的策略来确保自己胜出(如果无论如何也无法使自己胜出,则应优先确保双双失败)。请问最后的结果会是如何?
输入格式
输入包含多组数据。
第一行包含一个整数N (1 < N< 10^3),表示数据的组数。
接下来N 组数据,每组数据包含三行:
·第一行包含两个时间字符串 S1, S2,以空格分隔,表示你到达公司门口的时间和你和面试官约定的面试时间。
·第二行包含两个时间字符串 S3,S4,以空格分隔,表示小蓝到达公司门口的时间和小蓝和面试官约定的面试时间。
·第三行包含两个整数T,x (1<T, x< 120),以空格分隔,分别表示你的面试时长和你扶起扫把所需的时间(单位:分钟)。
时间的格式为 HH:MM:SS,其中 HH 表示小时 (00<
HH < 21),MM 表示分钟 (00 < MM < 59), SS 表示秒 (00 < SS < 59)。
输出格式
对于每组数据,输出一个字符串,表示最终的结果。。如果你胜出了,输出 You。
如果小蓝胜出了,输出 Lan。
如果你们双双失败了,输出 Draw。
题解代码
#include<iostream>
#include<string>
using namespace std;
int timeDif(string s1, string s2)
{
int s1H = ((int)s1[0] - 48) * 10 + ((int)s1[1] - 48);
int s2H = ((int)s2[0] - 48) * 10 + ((int)s2[1] - 48);
int Hdif = (s2H - s1H) * 3600;
int s1M = ((int)s1[3] - 48) * 10 + ((int)s1[4] - 48);
int s2M = ((int)s2[3] - 48) * 10 + ((int)s2[4] - 48);
int Mdif = (s2M - s1M) * 60;
int s1S = ((int)s1[6] - 48) * 10 + ((int)s1[7] - 48);
int s2S = ((int)s2[6] - 48) * 10 + ((int)s2[7] - 48);
int Sdif = s2S - s1S;
return Hdif + Mdif + Sdif;
}
int main()
{
int N;
cin >> N;
int *ret = new int[N];
string s1, s2, s3, s4;
int T, x;
for (int i = 0; i < N; i++) {
cin >> s1;
cin >> s2;
cin >> s3;
cin >> s4;
cin >> T >> x;
T *= 60;
x *= 60;
//我来了,小蓝没来
if (timeDif(s1, s2) >= 0 && timeDif(s3, s4) < 0)
ret[i] = 0;
//我没来,小蓝来了
else if (timeDif(s1, s2) < 0 && timeDif(s3, s4) >= 0)
ret[i] = 1;
//两人都没来
else if (timeDif(s1, s2) < 0 && timeDif(s3, s4) < 0)
ret[i] = 2;
//两人都来了,小蓝不能面试
else if (T > timeDif(s2, s4))
ret[i] = 0;
//两人都来了,我能扶扫把
else if (x <= timeDif(s1, s2))
ret[i] = 0;
//两人都来了,我没扶扫把
else if (x > timeDif(s1, s2))
ret[i] = 1;
}
for (int i = 0; i < N; i++) {
switch (ret[i]) {
case 0:
cout << "You" << endl;
break;
case 1:
cout << "Lan" << endl;
break;
case 2:
cout << "Draw" << endl;
break;
}
}
delete[]ret;
}
timeDif()函数
timeDif
函数主要用于计算两个时间字符串 s1
和 s2
之间的时间差。
首先,函数将时间字符串 s1
和 s2
拆分为小时、分钟和秒的部分进行处理。对于每个时间字符串,函数通过字符的 ASCII 码来提取时间信息。以小时部分为例,对于 s1
,它将 s1
的第一个字符 s1[0]
转换为整数(通过 (int)s1[0] - 48
),并乘以 10,再加上 s1
的第二个字符 s1[1]
转换为整数(通过 (int)s1[1] - 48
),从而得到 s1
的小时数,存储在 s1H
中。同样的方式用于计算 s2
的小时数,存储在 s2H
中。然后,将小时差 (s2H - s1H)
乘以 3600 转换为秒,存储在 Hdif
中,因为一小时等于 3600 秒。
对于分钟部分,函数提取 s1
的第四和第五个字符 s1[3]
和 s1[4]
,将它们转换为整数并计算出 s1
的分钟数,存储在 s1M
中。同样计算 s2
的分钟数存储在 s2M
中。将分钟差 (s2M - s1M)
乘以 60 转换为秒,存储在 Mdif
中,因为一分钟等于 60 秒。
对于秒部分,函数提取 s1
的第七和第八个字符 s1[6]
和 s1[7]
,将它们转换为整数得到 s1
的秒数,存储在 s1S
中。同样得到 s2
的秒数存储在 s2S
中。将秒差存储在 Sdif
中。
最后,将计算得到的小时差(以秒为单位)Hdif
、分钟差(以秒为单位)Mdif
和秒差 Sdif
相加,得到最终的时间差(以秒为单位),并将结果作为函数的返回值。
主函数
主函数是程序的入口点,其主要目的是根据输入的信息进行一系列的逻辑判断,并输出相应的结果。
首先,主函数声明一个整数变量 N
,。这个 N
表示后续需要处理的信息组数。接着,使用 new
操作符动态分配一个长度为 N
的整数数组 ret
,用于存储每组信息的最终结果。同时,声明了四个字符串变量 s1
、s2
、s3
、s4
和两个整数变量 T
、x
,它们将在后续的输入中被使用。
随后,程序进入一个 for
循环,该循环将执行 N
次,每次循环对应一组信息的处理。在每次循环中,程序会从标准输入读取四个时间字符串 s1
、s2
、s3
和 s4
以及两个整数 T
和 x
。这里的 s1
、s2
、s3
和 s4
应该表示不同的时间点,而 T
和 x
可能是某种时间阈值或时间长度。读取 T
和 x
后,将它们乘以 60,将其单位从分钟转换为秒,以便后续的时间比较和计算在同一时间单位下进行。
在获取到一组信息后,程序使用 timeDif
函数计算不同时间对之间的时间差,并根据这些时间差和 T
、x
的值进行一系列条件判断:
- 如果
timeDif(s1, s2) >= 0
且timeDif(s3, s4) < 0
,表示一种情况(例如,“我来了,小蓝没来”),将ret[i]
置为 0。 - 若
timeDif(s1, s2) < 0
且timeDif(s3, s4) >= 0
,表示另一种情况(如 “我没来,小蓝来了”),将ret[i]
置为 1。 - 当
timeDif(s1, s2) < 0
且timeDif(s3, s4) < 0
,表示 “两人都没来”,将ret[i]
置为 2。 - 当
T > timeDif(s2, s4)
时,意味着 “两人都来了,小蓝不能面试”,将ret[i]
置为 0。 - 若
x <= timeDif(s1, s2)
,表示 “两人都来了,我能扶扫把”,将ret[i]
置为 0。 - 而
x > timeDif(s1, s2)
,表示 “两人都来了,我没扶扫把”,将ret[i]
置为 1。
在完成所有 N
组信息的处理和判断后,程序进入另一个 for
循环,遍历 ret
数组。对于 ret[i]
的每个元素,使用 switch
语句进行输出:
- 当
ret[i]
的值为 0 时,输出"You"
。 - 当
ret[i]
的值为 1 时,输出"Lan"
。 - 当
ret[i]
的值为 2 时,输出"Draw"
。
最后,使用 delete[] ret
释放之前动态分配的数组内存,防止内存泄漏。