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

关于大根堆,set重载运算符

题目描述

\,\,\,\,\,\,\,\,\,\,制定合理的日程能够帮助利用好时间进行加训,加训和加训。
          \,\,\,\,\,\,\,\,\,\,新学期开始了,应该好好学习了!凌晨两点整,加睡失败的你在为新一天的各项重要事件制定闹钟。
          \,\,\,\,\,\,\,\,\,\,

          \,\,\,\,\,\,\,\,\,\,你的手上有一张日程表,上面列出了一些事件发生的时间。你想在每一个日程事件开始前 111, 333 和 555 分钟各设定一个闹钟,最后,将这些闹钟按照时间先后顺序依次输出(就像你在手机闹钟界面看到的一样)。注意,如果有多个闹钟被设定在同一时间,那么它们会被视为同一个。

          \,\,\,\,\,\,\,\,\,\,正式地,假设闹钟 aaa 将在 hah_aha​ 时 mam_ama​ 分响起,闹钟 bbb 在 hbh_bhb​ 时 mbm_bmb​ 分响起,那么:

  • 如果 ha<hbh_a<h_bha​<hb​ ,闹钟 aaa 先于闹钟 bbb 响起;
  • 当 ha=hbh_a=h_bha​=hb​ 时, 如果 ma<mbm_a<m_bma​<mb​ ,闹钟 aaa 先于闹钟 bbb 响起;
  • 当 ha=hbh_a=h_bha​=hb​ 时, 如果 ma=mbm_a=m_bma​=mb​ ,闹钟 aaa 和闹钟 bbb 应当被看作同一个闹钟。

输入描述:

          \,\,\,\,\,\,\,\,\,\,每个测试文件仅有一组测试数据。\,\,\,\,\,\,\,\,\,\,第一行输入一个整数 nnn (1≤n≤10001\le n\le 10001≤n≤1000) 表示日程的数量。\,\,\,\,\,\,\,\,\,\,随后 nnn 行,第 iii 行输入两个整数 hih_ihi​ 和 mim_imi​ (3≤hi≤233\le h_i \le 233≤hi​≤23, 0≤mi≤590\le m_i\le 590≤mi​≤59) 表示第 iii 个日程开始的时分(采用 242424 小时制),数字不包含前导零。注意可能有多个日程事件开始于同一时刻。

输出描述:

          \,\,\,\,\,\,\,\,\,\,第一行输出一个整数 mmm ,代表设定的闹钟数量。\,\,\,\,\,\,\,\,\,\,随后 mmm 行,第 iii 行输出两个由单个空格分隔的整数 hi′h_i'hi′​ 和 mi′m_i'mi′​ (0≤hi′≤230\le h_i' \le 230≤hi′​≤23, 0≤mi′≤590\le m_i'\le 590≤mi′​≤59) ,代表第 iii 个闹钟在 hi′h_i'hi′​ 时 mi′m_i'mi′​ 分响起。数字不应当包含前导零。

示例1

输入

复制2 3 5 3 3

2
3 5
3 3

输出

复制4 2 58 3 0 3 2 3 4

4
2 58
3 0
3 2
3 4

说明

 

          \,\,\,\,\,\,\,\,\,\,第一个日程事件开始于 030303:050505 ,我们需要在 030303:000000 、030303:020202 和 030303:040404 这三个时刻各设置一个闹钟。
          \,\,\,\,\,\,\,\,\,\,第二个日程事件开始于 030303:030303 ,我们需要在 020202:585858 、030303:000000 和 030303:020202 这三个时刻各设置一个闹钟。
          \,\,\,\,\,\,\,\,\,\,注意到 030303:000000 和 030303:020202 这两个时刻都被设置了两个闹钟,需要将它们看成同一个,最终共需设定四个闹钟。

疑问:

今天补题,用set写了一下,发现我还不太会重载运算符。我最短路的板子中是重载<,所以在这也重载了<。其实大根堆重载运算符就是重载<,set也是<。

#include<bits/stdc++.h>
using namespace std;
int n;
struct ty{int h,m;  bool operator < (const ty& a) const {if(h==a.h) return m>a.m;return h>a.h;}
};set<ty> s;
int main(){cin>>n;for(int i=1;i<=n;i++){ty tmp,tmp2;cin>>tmp.h>>tmp.m;if(tmp.m-1<0){tmp2.h=tmp.h-1;tmp2.m=59;}else tmp2.h=tmp.h,tmp2.m=tmp.m-1;s.insert(tmp2);if(tmp.m-3<0){tmp2.h=tmp.h-1;tmp2.m=(tmp.m-3)+60;}else tmp2.h=tmp.h,tmp2.m=tmp.m-3;s.insert(tmp2);if(tmp.m-5<0){tmp2.h=tmp.h-1;tmp2.m=(tmp.m-5)+60;}else tmp2.h=tmp.h,tmp2.m=tmp.m-5;s.insert(tmp2);}cout<<s.size()<<endl;for(set<ty>::iterator it=s.begin();it!=s.end();it++){cout<<(*it).h<<' '<<(*it).m<<endl;}return 0;
}

重载也可以写在结构体外面,但这样就括号后面就不用const。

#include<bits/stdc++.h>
using namespace std;
int n;
struct ty{int h,m;  
};
bool operator < (const ty& a,const ty& b) {if(b.h==a.h) return a.m<b.m;return a.h<b.h;
}
set<ty> s;
int main(){cin>>n;for(int i=1;i<=n;i++){ty tmp,tmp2;cin>>tmp.h>>tmp.m;if(tmp.m-1<0){tmp2.h=tmp.h-1;tmp2.m=59;}else tmp2.h=tmp.h,tmp2.m=tmp.m-1;s.insert(tmp2);if(tmp.m-3<0){tmp2.h=tmp.h-1;tmp2.m=(tmp.m-3)+60;}else tmp2.h=tmp.h,tmp2.m=tmp.m-3;s.insert(tmp2);if(tmp.m-5<0){tmp2.h=tmp.h-1;tmp2.m=(tmp.m-5)+60;}else tmp2.h=tmp.h,tmp2.m=tmp.m-5;s.insert(tmp2);}cout<<s.size()<<endl;for(set<ty>::iterator it=s.begin();it!=s.end();it++){cout<<(*it).h<<' '<<(*it).m<<endl;}return 0;
}

http://www.lryc.cn/news/320451.html

相关文章:

  • Algae c++
  • 开发常用的一些工具总结
  • k8s Yaml语法解析
  • 【晴问算法】提高篇—动态规划专题—最长公共子序列
  • Greetings
  • JS03-函数
  • MySQL | CRUD
  • 【电路笔记】-MOSFET作为开关
  • SpringBoot+Vue项目(Vue3环境搭建 + 基础页面)
  • elementui el-table表格自动循环滚动【超详细图解】
  • 关于学习的一点粗浅见解
  • [java基础揉碎]Object类详解
  • 23.1 微服务理论基础
  • 数据结构-基本概念-001
  • 以题为例浅谈SSRF
  • Java网络编程:探索奥秘与实践
  • Leetcode992-K个不同整数的子数组[两种方法] 关键词 滑窗
  • 【闲聊】-后端框架发展史
  • 界面控件DevExpress ASP.NET Scheduler - 助力快速交付个人信息管理系统(下)
  • 机器学习-04-分类算法-01决策树
  • 探索大数据时代的决策利器:如何有效应对海量数据?
  • Linux 学习笔记(16)
  • 【C语言】打印闰年
  • 外贸入门,很残忍但很真实的外贸真相
  • 【Linux网络编程七】网络序列化和反序列化(网络版本计算器)
  • 算法打卡day17|二叉树篇06|Leetcode 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
  • C语言之数据在计算机内部的存储
  • 程序人生——Java中基本类型使用建议
  • Pikachu 靶场搭建
  • 机器学习-绪论