这道题做到抓狂……理一下还是比较简单的,但是真的花了好久的时间……
注意审题啊审题!!!!
题目说明每次输入保证有一组匹配的记录,我理解为每个用户至少都有一组匹配记录……于是总是有两个测试点过不了,改到抓狂。
若某个用户没有匹配记录,则不输出该用户的任何内容。
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <map>
#include <vector>
#include <queue>
using namespace std;
map<string,bool> line;
map<string,int> cus;
double cost[24];
int N;
int month;
struct record
{
int sd;
int time;
bool online;
};
struct customer
{
string id;
vector<record> r;
double sum;
}c[1010];
bool cmp1(customer a ,customer b)
{
return a.id<b.id;
}
bool cmp(record a,record b)
{
if(a.sd!=b.sd)return a.sd<b.sd;
else return a.time<b.time;
}
double cal(record a,record b,int& totalm)
{
double sum=0;
int flag=a.time/60;
int minute=0;
while(cmp(a,b))
{
a.time++;
totalm++;
sum+=cost[flag];
int temp=a.time/60;
if(temp>flag)
{
if(temp==24)
{
flag=0;
a.sd++;
a.time=0;
}
else
{
flag++;
}
}
}
return sum;
}
int main()
{
for(int i=0;i<24;i++)
{
scanf("%lf",&cost[i]);
}
line["on-line"]=true;
line["off-line"]=false;
scanf("%d",&N);
int num=0;
for(int i=0;i<N;i++)
{
string id;
int day,h,m;
string linestatus;
cin>>id;
scanf("%d:%d:%d:%d",&month,&day,&h,&m);
record temp;
temp.sd=day;
temp.time=h*60+m;
cin>>linestatus;
temp.online=line[linestatus];
if(cus.find(id)==cus.end())
{
cus[id]=num++;
c[cus[id]].id=id;
}
c[cus[id]].r.push_back(temp);
}
sort(c,c+num,cmp1);
for(int i=0;i<num;i++)
{
sort(c[i].r.begin(),c[i].r.end(),cmp);
int index=0,start=0;
bool strat=false;
while(index<c[i].r.size()-1)
{
if(c[i].r[index].online==true&&c[i].r[index+1].online==false)
{
if(!start)
{
cout<<c[i].id<<" ";
printf("%02d\n",month);
start=true;
}
record a=c[i].r[index];
record b=c[i].r[index+1];
int totalm=0;
double s=cal(a,b,totalm);
c[i].sum+=s;
printf("%02d:%02d:%02d",a.sd,a.time/60,a.time%60);
printf(" ");
printf("%02d:%02d:%02d",b.sd,b.time/60,b.time%60);
printf(" ");
printf("%d ",totalm);
printf("$%.2f\n",s/100);
}
index++;
}
if(start)
{
printf("Total amount: $%.2f\n",c[i].sum/100);
}
}
system("pause");
return 0;
}