因为最近在准备考研,所以一直没机会来总结一下这次的PAT考试,今天抽个空来说说,算是为这几个月来的准备画上一个句号。
我大概算是从去年的十月份开始准备的,初衷是为了在大三的最后一段时间多参加一些比赛,避免考研进了复试后简历上奖项是空白的尴尬,而且以后机试迟早是要准备的~
当时对于算法和数据结构的代码这些算是零基础,因此买了一本算法笔记开始一步步地学,因为大三上学期的课还是挺多的,所以断断续续到了寒假也才学完了一半,最后一直到寒假结束才勉强刷完了上面的所有题目。
等到考试前才发现自己之前学的又忘了好多,然后花了一天复习一遍那些模板,前几年的真题都还没来得及刷就这样慌慌张张进了考场。
拿到题目先看了第一题心态就崩了,完全没思路,第一题不应该是签到题吗???看了五分钟果断翻到第二题,嗯这应该是个时间排序题,算法笔记上练过好多,但是代码好多,先看看下一题。第三题,堆排序!!!还好考前背了一下堆排序的模板,是啥来着,哎一紧张又记不得多少了。先看看最后一题。读了一遍题目,图论的题目,但是好复杂的样子,好像是要用好多次dijkstral最短路径,压轴题先放一放吧。然后我决定先攻破第二题,此时内心差不多已经平静了下来,认真分析了一下第二题,哎这题好像可以用贪心,不管了先试一下,花了20分钟一气呵成写完提交,AC了,NICE!!!25分到手,不至于0分了。此时时间过了差不多40分钟,我手贱点了一下排名,我擦,好多大佬都75分了,心态瞬间又崩了。看了一下这些大佬都是第三题还没有得分,难道这题才是最难的压轴题?然后我看了一下通过率,第四题的通过率居然比其他几题都要高,果断转战第四题。在纸上推演了一遍样例之后,突然发现这题好像floyd算法好像更简单一点,考前刚好有背过这个模板,虽然算法笔记上没有练过floyd的题目,但我还是决定大胆尝试一下,一次AC,太棒了!!!又到手了30分,心情有点好了。此时差不多过了一个半小时,看了一眼排名,我擦,好多大佬已经满分了。接着决定先做第一题,经过40分钟的尝试还是失败了,最后printf大法混了一分。最后开始分析第三题,读了一遍题目好像挺简单的啊,就是对堆排序的一些性质进行判断,然后就开始了艰难地回忆堆排序的模板代码,好在昨天刚看了一遍有点印象,最后成功写了出来。但是这时候题目对输入的判断又难住了我,只好用最笨的方法来慢慢分割,然后发现考点的devC++居然用不了C++11,好坑啊,只好放到考试端去测试,因为不能debug又浪费了好多时间,最后好在是在结束前10分钟拿下了24分,总分80,对我来说非常满意了,算是超常发挥了。
下面贴一下题目和代码
第一题
第一题就算了,只拿了1分,还是printf混到的
第二题
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 3000;
struct Time{
int Shh, Smm, Sss;
int Ehh, Emm, Ess;
}time[MAXN];
int n;
bool cmp(Time t1, Time t2){
if(t1.Ehh != t2.Ehh) return t1.Ehh < t2.Ehh;
if(t1.Emm != t2.Emm) return t1.Emm < t2.Emm;
if(t1.Ess != t2.Ess) return t1.Ess < t2.Ess;
}
bool g(Time t1, Time t2){
if(t1.Shh > t2.Ehh) return true;
else if(t1.Shh < t2.Ehh) return false;
else{
if(t1.Smm > t2.Emm) return true;
else if(t1.Smm < t2.Emm) return false;
else{
if(t1.Sss > t2.Ess) return true;
else if(t1.Sss < t2.Ess) return false;
else return true;
}
}
}
int main(){
scanf("%d", &n);
for(int i=0; i<n; i++){
scanf("%d:%d:%d %d:%d:%d", &time[i].Shh, &time[i].Smm, &time[i].Sss, &time[i].Ehh, &time[i].Emm, &time[i].Ess);
}
sort(time, time+n, cmp);
int ans = 1;
Time temp = time[0];
for(int i=1; i<n; i++){
if(g(time[i],temp)){
ans++;
temp = time[i];
}
}
printf("%d", ans);