A1016 Phone Bills(25分)(PA 15/25,所以先记录思路)
0. "计算时间"的思路:
计算 T1~T2 的时间差我是分为 t0-T1 和 T2-tn
来算的,其中 t0、tn 是整点小时数
比如现在计算 07:00-05:59,我这里是 (06:00-05:59)+(07:00-07:00) 的思路————即 T1=05, T2=07, t0=06, tn=07
基于上面这个思路,把两个 dd1:HH1:mm1-dd2:HH2:mm2 分三部分处理:
1) 计算分钟数
2) 计算小时数
3) 计算天数
比如计算 01:07:00-01:05:59:
1) 计算分钟数:min1=t0-05:59;
min2=07:00-tn
2) 计算小时数:hour=tn-t0
3) 计算天数: day=01:07-01:05
/* 伪码 */ //找出最接近起止两时段的小时 t0、tn while (T1 > t0++); while (T2 < tn) tn--; //前一时段的分钟数 min = 计算时间差(t0 - T1); dollar += (cent[t0 - 1] * min);//cent[]保存各小时的收费 duration += min; //后一时段的分钟数 min = 计算时间差(T2 - tn); dollar += (cent[tn] * min);//cent[]保存各小时的收费 duration += min; //计算 t0~tn 之间有多少个小时 hour = 计算时间差(dd1:HH1 - dd2:HH2); for( 0~hour 个小时 ) { if (到了24小时) 小时重置为0; dollar += (cent[t0] * 60); duration += 60; }
1. 输入:略
2. 排序:略
3. "取数组中两个有效的时段,计算它们的时间差与话费"的思路:
就是最简单的想法,从头开始遍历,遇到第一个"on-line"的同时判断下一个是否"off-line"?是就输出:否就检查下一个"on-line"
/* 伪码 */ for (i=0; i<n; ) { if (i==on-line 且 i+1==off-line) { 计算时间(i.[dd:HH:mm], i+1.[dd:HH:mm]); i+=2; } else { i+=1; } }