当前位置: 首页 > news >正文

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;  // 输出能够批准的最大申请数量
}

相关文章:

  • Arduino Uno R3连接HC-03
  • MVC 模式深度解析与 Spring 框架实践研究
  • Python运算符
  • MySQL存过
  • VirtualBox 无法枚举 USB 设备的问题
  • 力扣刷题HOT100——438.找到字符串中所有字母异位词
  • DAY 44 leetcode 28--字符串.实现strStr()
  • 【技术文章的标准结构与内容指南】
  • GIC驱动程序分析
  • 自注意力的机制内涵和设计逻辑
  • 151. 反转字符串中的单词
  • AJAX原理与XMLHttpRequest
  • 榕壹云酒水定制系统:基于THinKPHP+MySQL+UniApp打造数字化时代的个性化购酒新体验
  • EasyCVR视频汇聚系统:AIoT+视频智能分析赋能食品安全生产全流程监管
  • golang-非orm数据库的操作与对比 database/sql、sqlx 和 sqlc
  • 鸿蒙开发-模块化-导入,导出模块
  • 【信息系统项目管理师】高分论文:论信息系统项目的整合管理(银行数据仓库项目)
  • C#进阶学习(二)泛型及泛型约束的认识
  • day25 学习笔记
  • Python字符串split()函数完全指南
  • 俄总理:2024年俄罗斯GDP增长4.3%
  • 最高检:去年共受理审查逮捕侵犯知识产权犯罪13486人
  • 特斯拉季度利润暴跌71%,马斯克下月开始大幅减少为政府工作时间
  • 王励勤当选中国乒乓球协会新一任主席
  • 这5种走路姿势,藏着疾病秘密,第2种你可能也有
  • 特朗普“炮轰”美联储带崩美股!道指跌超900点,黄金再创新高