【作业向】程序设计思维与实践 Week10 限时大模拟
♔A 签到题
这是真·签到题,若读入的三个数中有偶数,则可以平均分配,直接输出0;若没有偶数则无法平均分配,为了差距最小,则输出三个数中较小的两个数的乘积。
1 |
|
♔B 团队聚会
这一题还是比较考验代码能力和思维能力的,我的做法是将读入的事件拆开,分成开始和结束两个事件,并记录是事件类型及所属的队员,然后按时间进行排序。排好序后检查开头的事件是否是1800/01/01 00:00:00,若不是则加入一个时间为1800/01/01 00:00:00的空事件;然后检查结尾的事件是否为2200/01/01 00:00:00,若不是则加入一个时间为2200/01/01 00:00:00的空事件。然后再进行排序(这样写常数可能大了一些)。
接下来进行一次遍历,若一个事件不与上一个事件时间重复,则加入到时间队列中;若时间重复则跳过(奇怪的常数增加了)。然后定义数组visit[i] [j],若为一,则表示第i个人在第j个时间有事情,这一个我们通过类似于前缀和的方法来处理。处理完成后需要再处理出visit[0] [j]表示在第j个时间有visit[0] [j]个人有事情,至此处理的部分就完成了。
然后进行求解,一个时间满足要求的条件是在该时段有事情的人要小于等于一,且总人数减去有事情的人数大于等于总人数减1。又因为时间段要尽可能的长,因此我们需要找的起点是连续一段满足条件的时间段中的第一个时间段,终点是连续一段满足条件的时间段后的第一个不满足条件的时间段。
然后判断是否大于等于一小时,这里都转化为秒来计算。又因为每个月只有30天,所以无法使用ctime中自带的函数进行转换。我的方法是,对于时间a和b(a早于b),t等于b的年减去a的年,t自乘12,t等于t+b的月减a的月,然后t自乘30,t等于t+b的天减a的天,,,以此类推就可以算出b比a晚多少秒,若t大于等于3600秒,则符合要求,则进行输出,否则继续遍历。
由此可见,这个做法的时间复杂度主要是在排序上,总的时间复杂度是O(Tmnlog(mn))还是比较优秀的。
1 |
|