在时间差额和费用的计算上有些问题,既繁琐还容易出错,可以参考柳婼PAT1016,也算是为以后类似的计算提供了一种通法
#pragma warning(disable:4996)
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct information
{
char name[22];
int MM, dd, hh, mm;
char line[10];
}info[1010];
bool cmp(struct information a, struct information b)
{
int s = strcmp(a.name, b.name);
if (s != 0)
return s < 0;
if (a.MM != b.MM)
return a.MM < b.MM;
else if (a.dd != b.dd)
return a.dd < b.dd;
else if (a.hh != b.hh)
return a.hh < b.hh;
else
return a.mm < b.mm;
}
int havecout = 0;
double personsum = 0;
int main()
{
int fee[24], daysum = 0;
for (int i = 0; i < 24; i++)
{
scanf("%d", &fee[i]);
daysum = daysum + fee[i];
}
int N;
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
scanf("%s %d:%d:%d:%d %s", info[i].name, &info[i].MM, &info[i].dd, &info[i].hh, &info[i].mm, info[i].line);
}
sort(info, info + N, cmp);
char on[10] = { "on-line" };
char off[10] = { "off-line" };
for (int i = 0; i < N - 1; i++)
{
if (strcmp(on, info[i].line) == 0)
{
if (strcmp(info[i + 1].name, info[i].name) == 0 && (strcmp(off, info[i + 1].line) == 0))
{
if (havecout == 0)
{
printf("%s %02d\n", info[i + 1].name, info[i + 1].MM);
havecout++;
}
printf("%02d:%02d:%02d ", info[i].dd, info[i].hh, info[i].mm);
printf("%02d:%02d:%02d ", info[i + 1].dd, info[i + 1].hh, info[i + 1].mm);
double sum = 0;
int time = 0;
sum = (info[i + 1].dd - info[i].dd)*daysum*60;
time = (info[i + 1].dd - info[i].dd) * 24 * 60;
sum = sum + fee[info[i].hh] * (60 - info[i].mm) + fee[info[i + 1].hh] * info[i + 1].mm;
time = time + 60 - info[i].mm + info[i + 1].mm;
if (info[i].hh == info[i + 1].hh)
{
time = time - 60;
sum = sum - 60 * fee[info[i].hh];
}
for (int j = info[i].hh + 1; j < info[i + 1].hh; j++)
{
sum = sum + fee[j] * 60;
time = time + 60;
}
printf("%d $%.2f\n", time, sum / 100);
personsum = personsum + sum / 100;
int flag = 1;
for (int j = i + 2; j < N - 1; j++)
{
if (strcmp(info[i].name, info[j+1].name) == 0)
if (strcmp(info[j].line, on) == 0 && strcmp(info[j + 1].line, off) == 0)
{
flag = 0;
break;
}
if (strcmp(info[i].name, info[j + 1].name) != 0)
{
break;
}
}
if (flag==1)
{
havecout = 0;
printf("Total amount: $%.2f\n", personsum);
personsum = 0;
}
}
}
}
}