A1016 | 磨人的大模拟

这题写得头晕……明天我再评价

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>


#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 1010
#define MAX 0x06FFFFFF
#define V vector<int>

using namespace std;

set<string> printTitle;

typedef struct Record{
    string name;
    int month,dd,hh,mm;
    int isOn;
    Record(){}
    Record(const Record& o){
        name=o.name;month=o.month;dd=o.dd;hh=o.hh;mm=o.mm;isOn=o.isOn;
    }
}Record;

Record info[LEN];
int rate[24];
int one_day_bill=0;

void init_one_day_bill(){
    int i;
    FF(i,24){
        one_day_bill+=60*rate[i];
    }
}

bool cmp(Record a,Record b){
    /*
    if(a.name<b.name) return true;
    else if(a.mouth<b.mouth) return true;
    else if(a.dd<b.dd) return true;
    else if(a.hh<b.hh) return true;
    else if(a.mm<b.mm) return true;
    return false;*/
    if(a.name!=b.name) return a.name<b.name;
    else if(a.month!=b.month) return a.month<b.month;
    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;
}

void diff(Record a,Record b,int& minute,int& money){
//    minute=b.mm-a.mm+(b.hh-a.hh)*60+(b.dd-a.dd)*24*60;
//    int i;
//    money=0;
//    if(a.dd!=b.dd)
//        money+=(b.dd-a.dd)*one_day_bill;
//    if(a.hh==b.hh) money=minute*rate[a.hh];
//    else{
//        for(i=a.hh;i<=b.hh;i++){
//            if(i==a.hh) money+=(60-a.mm)*rate[i];
//            else if(i==b.hh) money+=(b.mm)*rate[i];
//            else money+=(60)*rate[i];
//        }
//    }
    Record tmp=a;
    minute=0;money=0;
    while(tmp.dd<b.dd || tmp.hh< b.hh || tmp.mm < b.mm){
        minute++;
        money+=rate[tmp.hh];
        tmp.mm++;
        if(tmp.mm>=60){
            tmp.mm=0;
            tmp.hh++;
        }
        if(tmp.hh>=24){
            tmp.hh=0;
            tmp.dd++;
        }
    }
}

int main(){
    freopen("d:/input/A1016.txt","r",stdin);
    int n,i;
    FF(i,24){
        scanf("%d",&rate[i]);
    }
    init_one_day_bill();
    scanf("%d",&n);
    FF(i,n){
        char buffer[100];
        I("%s",buffer);
        I("%d:%d:%d:%d",&info[i].month,&info[i].dd,&info[i].hh,&info[i].mm);
        info[i].name=buffer;
        I("%s",buffer);
        if(string(buffer)=="on-line") info[i].isOn=1;
        else info[i].isOn=0;
    }
    sort(info,info+n,cmp);

    int on=0,off,next;
    while(on<n){
        int needPrint=0;
        next=on;
        while(next<n && info[next].name==info[on].name){
            if(needPrint==0 && info[next].isOn){
                needPrint=1;
            }else if(needPrint==1 && info[next].isOn==0){
                needPrint=2;
            }
            next++;
        }
//        printf("%d\n",needPrint);
        if(needPrint<2){
            on=next;
            continue;
        }
        int allMoney=0;
        O("%s %02d\n",info[on].name.c_str(),info[on].month);
        while(on<next){
            while(on<next-1 && !(info[on].isOn&&info[on+1].isOn==0)) on++;
            off=on+1;
            if(off==next){
                on=next;
                break;
            }
            Record a=info[on],b=info[off];
            int minute;
            int money;
            diff(a,b,minute,money);
            allMoney+=money;
            O("%02d:%02d:%02d %02d:%02d:%02d %d $%.2lf\n",a.dd,a.hh,a.mm,b.dd,b.hh,b.mm,minute,money/100.);
            on=off+1;
        }
        O("Total amount: $%.2lf\n",allMoney/100.);
    }
    return 0;
}
View Code

 

posted @ 2018-01-14 20:00  TQCAI  阅读(147)  评论(0编辑  收藏  举报