问题 C: 停车计费——循环/判断/时间差值问题
问题 C: 停车计费——循环/判断/时间差值问题
题目描述
某小区对外来车辆按照如下规则计费:
半小时内(含半小时),免费;
超过半小时到六小时(含六小时),每小时 2 元,不足一小时以一小时计算;
超过六小时,每小时 5 元,不足一小时以一小时计算。
给定车辆的进入和离开时间(保证没有跨过一天的零点),请计算应收金额。
输入
第一行:一个字符串,表示车辆进入小区的时间。
第二行:一个字符串,表示车辆离开小区的时间。
输入采用“HH:MM:SS”的形式表示时间,其中“HH”表示小时,范围为 00 到 23,“MM”
表示分钟,范围为 00 到 59,“SS”描述秒数,范围为 00 到 59。时、分、秒均为两位数。
输出
第一行:表示车辆的停留时间,格式与输入保持相同。
第二行:单个整数,表示停车费用。
样例输入
【样例1】
10:00:00
14:00:00
【样例2】
12:34:56
20:36:22
【样例3】
23:29:59
23:59:59
样例输出
【样例1】
04:00:00
8
【样例2】
08:01:26
45
【样例3】
00:30:00
0
题解/思路
惯例(吐槽):
憨憨本人没注意到,车辆离开小区时间的分秒比车辆进入小区时间小,以至于需要退位的情况,样例2怎么都过不去。
正解:
- 注意“不足一小时以一小时计算“,即超过六小时过一秒,都算七个小时”
- 注意”含半小时“”含六小时“,即30:00:00属于免费,而30:00:01算一个小时;
- 思路比较简单:数字字符通过 - ‘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;
}
总结:
当遇到类似的时间差值问题,可借鉴以上从小到大借位。考虑负值情况。