zoukankan      html  css  js  c++  java
  • PAT甲级1016Phone Bills

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<vector>
    #include<algorithm>
    #include<string>
    #include<cstring>
    #include<map>
    #include<iterator>
    using namespace std;
    
    #define ONLine    ("on-line")
    struct Record
    {
        Record(){};
        Record(char *szName,char* szTime,char* szOnline)
        {
            bOnline = (strcmp(szOnline,ONLine)==0);
            strName = szName;
            strTime = szTime;        
        }
        string strName;
        string strTime;
        bool   bOnline;    
    };
    struct RecordTime
    {
        string strStartTime;
        string strEndTime;
        RecordTime(string starttime,string endtime)
        {
            strStartTime = starttime;
            strEndTime = endtime;
        }    
        RecordTime(){}
    };
    struct MyTime
    {
        MyTime(){};
        MyTime(const char *cTime)
        {
            dd = 10*(cTime[0]-'0')+(cTime[1]-'0');
            hh = 10*(cTime[3]-'0')+(cTime[4]-'0');
            mm = 10*(cTime[6]-'0')+(cTime[7]-'0');
            iTick = dd*24*60+hh*60+mm;    
        }
        int dd;
        int hh;
        int mm;    
        int iTick;
    };
    int iPrice[24];
    map<string,int> mapRecord;
    vector<Record> vcRecord[1010]; 
    vector<RecordTime> vcDisplay[1010];
    bool Comp(const Record& r1,const Record& r2)
    {
        return r1.strTime.compare(r2.strTime)<0;
    }
    int getOneDayBill()
    {
        int iSum = 0;
        for(int i=0;i<24;++i)
            iSum += (60*iPrice[i]);
        return iSum;    
    }
    float DisplayOneCall(const RecordTime &rt)
    {
        string outStartTime = rt.strStartTime.substr(3,8);
        string outEndTime = rt.strEndTime.substr(3,8);
        printf("%s %s ",outStartTime.c_str(),outEndTime.c_str());
        MyTime mtime1(outStartTime.c_str()),mtime2(outEndTime.c_str());
        int iTotalTime = mtime2.iTick - mtime1.iTick;
        float fTatalBill = 0.0f;
        
        //计算账单,用每一分钟遍历,可以AC 
        /*for(int dd=mtime1.dd,hh=mtime1.hh,mm=mtime1.mm;
            !(dd==mtime2.dd&&hh==mtime2.hh&&mm==mtime2.mm);)
        {
            fTatalBill += iPrice[hh];
            if(++mm == 60)
            {
                mm = 0;
                ++hh;
            }        
            if(hh == 24)
            {
                hh = 0;
                ++dd;
            }
        }
        */
        //把中间几个整天提出来,然后剩余的按分钟遍历,可以AC 
        /*int iDay = iTotalTime/60/24;
        fTatalBill += iDay*getOneDayBill();
        for(int hh=mtime1.hh,mm=mtime1.mm;
            !(hh==mtime2.hh&&mm==mtime2.mm);)
        {
            fTatalBill += iPrice[hh];
            if(++mm == 60)    mm = 0,++hh;
            if(hh == 24)    hh = 0;
        }
        */
        
        int iDay = iTotalTime/60/24;
        fTatalBill += iDay*getOneDayBill();
        if((mtime1.hh > mtime2.hh) 
            || (mtime1.hh == mtime2.hh&&(mtime1.mm> mtime2.mm)))
            mtime2.hh += 24;
        if(mtime1.hh == mtime2.hh && mtime2.mm>mtime1.mm)
            fTatalBill += iPrice[mtime1.hh]*(mtime2.mm-mtime1.mm);
        else
            for(int hh = mtime1.hh;hh<=mtime2.hh;++hh)
            {
                if(hh == mtime1.hh)
                   fTatalBill += iPrice[hh%24]*(60-mtime1.mm);
                else if(hh == mtime2.hh)
                   fTatalBill += iPrice[hh%24]*(mtime2.mm);
                else
                   fTatalBill += iPrice[hh%24]*(60);    
            }
        fTatalBill = 1.0*fTatalBill/100;
        printf("%d $%.2f
    ",iTotalTime,fTatalBill);
        return fTatalBill;
    }
    int main()
    {
        for(int i=0;i<24;++i)
            scanf("%d",&iPrice[i]);
        int n;
        scanf("%d",&n);
        int cnt=0;
        for(int i=0;i<n;++i)
        {
            char szName[30],szTime[30],szOnline[30];
            scanf("%s%s%s",szName,szTime,szOnline);
            Record record(szName,szTime,szOnline);
            if(mapRecord.find(szName)==mapRecord.end())
            {
                mapRecord[szName] = cnt++;
            }
            vcRecord[mapRecord[szName]].push_back(record);
        }
        for(int i=0;i<cnt;++i)
        {
            sort(vcRecord[i].begin(),vcRecord[i].end(),Comp);
            int iFindOnLine = -1;
            for(int j=0;j<vcRecord[i].size();++j)
            {
                if(vcRecord[i][j].bOnline==false && iFindOnLine != -1)
                {
                    RecordTime rt(vcRecord[i][iFindOnLine].strTime,
                        vcRecord[i][j].strTime);
                    vcDisplay[i].push_back(rt);
                    iFindOnLine = -1;
                }    
                else if(vcRecord[i][j].bOnline)
                {
                    iFindOnLine = j;
                }
            }    
        }
    
        map<string,int>::iterator it = mapRecord.begin();
        for(;it != mapRecord.end();it++)
        {
            int i = it->second;
            if(vcDisplay[i].size()> 0)
            {
                string strYue = vcRecord[i][0].strTime.substr(0,2);
                printf("%s %s
    ",it->first.c_str(),strYue.c_str());
                float fSum = 0;
                for(int j=0;j<vcDisplay[i].size();++j)
                    fSum +=DisplayOneCall(vcDisplay[i][j]);
                printf("Total amount: $%.2f
    ",fSum);
            }
            else
            {
                
            }
        }
        
        return 0;
    }
  • 相关阅读:
    html <select> <option> 实现根据选择不同的option,调用不同的方法功能
    jquery 实现无缝循环广告
    Linux 一次性杀死用户所有进程
    jquerymobile总结
    jQuery lightBox plugin
    开始算法复习。。。
    关于android Intent意图的一点心得
    好了,咳咳,就从这里这时开始吧
    CSV文件的生成与分析
    【观点】想写代码?离开你的电脑吧!
  • 原文地址:https://www.cnblogs.com/jlyg/p/10231263.html
Copyright © 2011-2022 走看看