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; }

}

 

代码地址

posted @ 2021-01-10 15:28  幼麟  阅读(99)  评论(0编辑  收藏  举报