问题 C: 停车计费——循环/判断/时间差值问题

问题 C: 停车计费——循环/判断/时间差值问题

题目描述

某小区对外来车辆按照如下规则计费: 
半小时内(含半小时),免费; 
超过半小时到六小时(含六小时),每小时 2 元,不足一小时以一小时计算; 
超过六小时,每小时 5 元,不足一小时以一小时计算。 
给定车辆的进入和离开时间(保证没有跨过一天的零点),请计算应收金额。

输入

第一行:一个字符串,表示车辆进入小区的时间。 
第二行:一个字符串,表示车辆离开小区的时间。 
输入采用“HH:MM:SS”的形式表示时间,其中“HH”表示小时,范围为 0023,“MM”
表示分钟,范围为 0059,“SS”描述秒数,范围为 0059。时、分、秒均为两位数。 

输出

第一行:表示车辆的停留时间,格式与输入保持相同。 
第二行:单个整数,表示停车费用。 

样例输入

【样例110:00:00 
14:00:00
【样例212:34:56 
20:36:22
【样例323:29:59 
23:59:59 

样例输出

【样例104:00:00 
8 
【样例208:01:26 
45
【样例300:30:00 
0  

题解/思路

惯例(吐槽):

憨憨本人没注意到,车辆离开小区时间的分秒比车辆进入小区时间小,以至于需要退位的情况,样例2怎么都过不去。

正解:

  1. 注意“不足一小时以一小时计算“,即超过六小时过一秒,都算七个小时”
  2. 注意”含半小时“”含六小时“,即30:00:00属于免费,而30:00:01算一个小时;
  3. 思路比较简单:数字字符通过 - ‘0’,可转换成int型数据,分别计算时,分,秒之间的差值。至于题目条件,我是全部转化成秒,进行比较。考虑到车辆离开小区时间的分秒比车辆进入小区时间小,以至于需要退位的情况,可通过从小到大借位解决。最后,考虑补0的问题即可

代码:

#include<bits/stdc++.h>
 
using namespace std;
 
int main()
{
    string come,left;
    char sum[8];
    int ans;
    cin>>come;
    cin>>left;
    //转换
    int h1 = (come[0]-'0')*10+(come[1]-'0');
    int m1 = (come[3]-'0')*10+(come[4]-'0');
    int s1 = (come[6]-'0')*10+(come[7]-'0');
    int h2 = (left[0]-'0')*10+(left[1]-'0');
    int m2 = (left[3]-'0')*10+(left[4]-'0');
    int s2 = (left[6]-'0')*10+(left[7]-'0');
    //转换时长为秒,进行题目要求的条件判断
    int sum1=h1*3600+m1*60+s1;
    int sum2=h2*3600+m2*60+s2;
    if(sum2-sum1<=1800)
        ans=0;
    else if(sum2-sum1<=21600&&sum2-sum1>1800)
    {
        if((sum2-sum1)%3600==0)
            ans=2*((sum2-sum1)/3600);
        else
            ans=2*((sum2-sum1)/3600)+2;
    }
    else
    {
        if((sum2-sum1)%3600==0)
            ans=5*((sum2-sum1)/3600);
        else
            ans=5*((sum2-sum1)/3600)+5;
    }
    
    int a = h2-h1;
    int b = m2-m1;
    int c = s2-s1;
    //由于存在车辆离开小区时间的分秒比车辆进入小区时间小的情况,b,c有可能为负值,一旦为负值,则向前借位
    if(c<0) {
        b--;
        c+=60;
    }
    if(b<0) {
        b+=60;
        a--;
    }
    //若差值不足10,则需要在该数字前补0
    if(a<10)
        cout<<0;
    cout<<a<<":";
    if(b<10)
        cout<<0;
    cout<<b<<":";
    if(c<10)
        cout<<0;
    cout<<c<<endl;
    //最后输出根据题目条件算出的总费用即可
    cout<<ans;
}

总结:

当遇到类似的时间差值问题,可借鉴以上从小到大借位。考虑负值情况。

posted @ 2021-01-12 20:32  许君  阅读(189)  评论(0编辑  收藏  举报