题目描述
\,\,\,\,\,\,\,\,\,\,制定合理的日程能够帮助利用好时间进行加训,加训和加训。
\,\,\,\,\,\,\,\,\,\,新学期开始了,应该好好学习了!凌晨两点整,加睡失败的你在为新一天的各项重要事件制定闹钟。
\,\,\,\,\,\,\,\,\,\,
\,\,\,\,\,\,\,\,\,\,你的手上有一张日程表,上面列出了一些事件发生的时间。你想在每一个日程事件开始前 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;
}