1016. Phone Bills (25)

关键点:

1. 用qsort进行一次排序,由于qsort是不稳定的,所以不能分时间和名字两次排序

2. 费用计算问题,需考虑dd相等和hh相等的情况

3. total输出判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <cstdio>
#include <cstdlib>
#include <cstring>
int rate[24];
int n;
int time;
float total=0;
typedef struct{
  char name[21];
  char time[21];
  char state[10];
}record;
record rec[1001];

int cmp(const void *a1, const void *a2){
  record *r1=(record *)a1,*r2=(record *)a2;
  if(strcmp(r1->name,r2->name)==0)
    return strcmp(((record *)a1)->time,((record *)a2)->time);
  return strcmp(r1->name,r2->name);
}
float calc(char *t1,char *t2){
  int d=(t2[0]-t1[0])*10+t2[1]-t1[1];
  int h1,h2,m1,m2;
  float fee;
  h1=(t1[3]-'0')*10+t1[4]-'0';
  h2=(t2[3]-'0')*10+t2[4]-'0'+24*d;
  m1=(t1[6]-'0')*10+t1[7]-'0';
  m2=(t2[6]-'0')*10+t2[7]-'0';
  time=(h2-h1)*60+m2-m1;
  if(h1==h2) fee=rate[h1]*(m2-m1);
  else fee=rate[h1]*(60-m1)+rate[h2%24]*m2;
  for(h1++;h1<h2;h1++)
    fee+=rate[h1%24]*60;
  return fee/100;
}

int main(){
  for(int i=0;i<24;i++)
    scanf("%d",&rate[i]);
  scanf("%d",&n);
  for(int i=0;i<n;i++)
    scanf("%s%s%s",rec[i].name,rec[i].time,rec[i].state);
  qsort(rec,n,sizeof(record),cmp);
  bool output=false;    //当前name是否输出过记录
  for(int i=0;i<n-1;i++){
    if(strcmp(rec[i].name,rec[i+1].name)){  //the name of next record is not same as the current one
      if(output){
        output=false;
        printf("Total amount: $%.2f\n",total);
        total=0;
      }
    }
    else if(strncmp(rec[i].state,"on",2)==0 && strncmp(rec[i+1].state,"of",2)==0){
      if(!output){
        printf("%s %c%c\n",rec[i].name,rec[i].time[0],rec[i].time[1]);
        output=true;
      }
      time=0;
      float fee=calc(rec[i].time+3,rec[i+1].time+3);
      total+=fee;
      printf("%s %s %d $%.2f\n",&rec[i].time[3],&rec[i+1].time[3],time,fee);
    }
  }
  if(total>0) printf("Total amount: $%.2f",total);
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值