PTA | 实验室使用排期
目录
题目:
输入格式:
输出格式:
输入样例:
输出样例:
样例解释:
代码:
无注释版:
有注释版:
题目:
受新冠疫情影响,当前大家的活动都必须注意保持充分的社交距离,国家实验室的使用也同样受到了严格的限制。假设规定任何一个时间点上,实验室内最多只能有 1 个人,且每个人都必须提前申请实验室的使用,只有申请被批准后才能进入。现给定一批第二天的实验室使用申请,你需要写个程序自动审批,使得能够被批准的申请数量最大化。
输入格式:
输入第一行首先给出一个正整数 N(≤2×103),为申请总量。随后 N 行,每行按以下格式给出申请信息:
hh:mm:ss hh:mm:ss
其中 hh:mm:ss
表示一天内的时间点“小时:分钟:秒钟”,最早从 00:00:00
开始,最晚到 23:59:59
结束。第一个时间点为进入实验室的时间,第二个是离开时间。题目保证离开时间在进入时间之后。
注意所有时间都在一天之内。时间按 24 小时显示。
输出格式:
在一行中输出能够被批准的最大申请数量。
输入样例:
7
18:00:01 23:07:01
04:09:59 11:30:08
11:35:50 13:00:00
23:45:00 23:55:50
13:00:00 17:11:22
06:30:50 11:42:01
17:30:00 23:50:00
输出样例:
5
样例解释:
除了最后两个申请,其它都可以被批准。
代码长度限制16 KB,时间限制200 ms,内存限制64 MB,栈限制8192 KB
代码:
无注释版:
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct ff{
int a,b;
}a[10010];
int f(string s){
int sum=0;
sum+=((s[0]-'0')*10+(s[1]-'0'))*3600;
sum+=((s[3]-'0')*10+(s[4]-'0'))*60;
sum+=(s[6]-'0')*10+(s[7]-'0');
return sum;
}
bool cmp(ff p,ff q){
if(p.b==q.b) return p.a<q.a;
return p.b<q.b;
}
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
string x,y;
cin>>x>>y;
a[i].a=f(x);
a[i].b=f(y);
}
sort(a+1,a+n+1,cmp);
int cnt=1;
int t=a[1].b;
for(int i=2;i<=n;i++){
if(a[i].a>=t){
cnt++;
t=a[i].b;
}
}
cout<<cnt;
}
有注释版:
#include<bits/stdc++.h> // 引入所有标准库,包括输入输出流、算法、容器等
using namespace std; // 使用标准命名空间,省去书写std::
#define int long long // 将int定义为long long,以防数据溢出
// 定义结构体ff,用来存储每个申请的进入时间a和离开时间b
struct ff {
int a, b; // a为进入时间,b为离开时间
} a[10010]; // 数组a,用来存储最多10010个申请信息
// 函数f,将时间字符串转化为以秒为单位的整数
int f(string s) {
int sum = 0;
// 计算小时部分并转化为秒:((小时数) * 3600)
sum += ((s[0] - '0') * 10 + (s[1] - '0')) * 3600;
// 计算分钟部分并转化为秒:((分钟数) * 60)
sum += ((s[3] - '0') * 10 + (s[4] - '0')) * 60;
// 计算秒部分
sum += (s[6] - '0') * 10 + (s[7] - '0');
return sum; // 返回总秒数
}
// 比较函数cmp,用来排序
bool cmp(ff p, ff q) {
if (p.b == q.b) // 如果两个申请的离开时间相同
return p.a < q.a; // 比较进入时间,进入时间早的排前面
return p.b < q.b; // 否则按离开时间升序排列
}
signed main() {
int n;
cin >> n; // 输入申请的总数n
// 读取每个申请的进入时间和离开时间,并转换为秒数存储在结构体数组a中
for (int i = 1; i <= n; i++) {
string x, y;
cin >> x >> y; // 读取进入时间x和离开时间y
a[i].a = f(x); // 将进入时间x转化为秒数
a[i].b = f(y); // 将离开时间y转化为秒数
}
// 按照离开时间升序,若离开时间相同,则按进入时间升序排序
sort(a + 1, a + n + 1, cmp);
int cnt = 1; // 至少可以批准第一个申请
int t = a[1].b; // 第一个申请的离开时间,作为后续申请的比较基准
// 遍历剩余的申请,检查是否可以批准
for (int i = 2; i <= n; i++) {
if (a[i].a >= t) { // 如果当前申请的进入时间大于等于上一个批准申请的离开时间
cnt++; // 批准当前申请
t = a[i].b; // 更新离开时间为当前申请的离开时间
}
}
cout << cnt; // 输出能够批准的最大申请数量
}