pat-1016(模拟)

pat-1016

思路:

将所有记录按照时间先后排序,然后统计时间符合前面起始,后面终止的且名称相同的记录,然后统计这些

记录对的时间,价格,第一个记录特殊标记一下就好了。

 

难点:计算时间的花费,记录起始时间st,终止时间ed,然后求出这段时间内的收费情况。

可以计算从这个月的00:00:00开始,到时间点x的花费的函数cal(),然后让cost=cal(ed)-cal(st)。

cal()函数从0h开始,统计这个月的x中有多少整点小时,然后再统计x的不足1h的时间。

参考文章

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100100;
struct Node{
	char name[50],stu[20];
	int mo,dd,hh,mm,tim,zt;
}cur[maxn];
int ttm[50];
bool cmp(Node a,Node b)
{
	if(strcmp(a.name,b.name)!=0) return strcmp(a.name,b.name)<0;
	else return a.tim<b.tim;
}
double cal(int t)
{
	double sum=0;
	int i;
	for(i=0;i<t/60;i++){
		sum+=ttm[i%24]*60/100.0;
	}
	sum+=ttm[i%24]*(t%60)/100.0;
	return sum;
}
int main(void)
{
	int n,i,x,j,fg;
	for(i=0;i<24;i++) scanf("%d",&ttm[i]);
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%s %d:%d:%d:%d %s",cur[i].name,&cur[i].mo,&cur[i].dd,&cur[i].hh,&cur[i].mm,cur[i].stu);
		if(strcmp(cur[i].stu,"on-line")==0) cur[i].zt=1;
		else cur[i].zt=-1;
		cur[i].tim=cur[i].dd*24*60+cur[i].hh*60+cur[i].mm;
	}
	sort(cur,cur+n,cmp);
	char str[50];
	fg=0;
	double sum=0,tp;
	for(i=1;i<=n;i++){
		if(cur[i-1].zt==1&&cur[i].zt==-1&&strcmp(cur[i-1].name,cur[i].name)==0){
			if(fg==0){
				strcpy(str,cur[i-1].name);
				fg=1;sum=0;
				printf("%s %02d\n",cur[i-1].name,cur[i-1].mo);
			}
			if(strcmp(str,cur[i-1].name)!=0){
				printf("Total amount: $%.2lf\n",sum);
				sum=0;
				strcpy(str,cur[i-1].name);
				printf("%s %02d\n",cur[i-1].name,cur[i-1].mo);
				tp=cal(cur[i].tim)-cal(cur[i-1].tim);
				sum+=tp;
				printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",cur[i-1].dd,cur[i-1].hh,cur[i-1].mm,
				cur[i].dd,cur[i].hh,cur[i].mm,cur[i].tim-cur[i-1].tim,tp);
			}
			else{
				tp=cal(cur[i].tim)-cal(cur[i-1].tim);
				sum+=tp;
				printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",cur[i-1].dd,cur[i-1].hh,cur[i-1].mm,
				cur[i].dd,cur[i].hh,cur[i].mm,cur[i].tim-cur[i-1].tim,tp);
			}
		}
	}
	printf("Total amount: $%.2lf\n",sum);
	return 0;
}

 

上一篇:PAT Basic 1016


下一篇:BZOJ 1016 生成树计数