1016 重要Phone Bills (25)

#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
#include <sstream>
#include <iomanip>
using namespace std;

struct billnode
{
 string name;
 int mouth,date,hour,mini,total;
 string status;
 bool operator < (const billnode & node) const
 {
  return total<node.total;
 }
};
class CA
{
public:
 enum{hour_num=24};
 void run();
 double getcharge(billnode& b1,billnode& b2);
private:
 map<string,vector<billnode> > mbl;
 vector<int> toll;
};
double CA::getcharge(billnode& b1,billnode& b2)
{
 int ih1,ih2,im1,im2;
 double fc=0;
 ih1=b1.hour;
 ih2=b2.hour+(b2.date-b1.date)*24;
 im1=b1.mini;
 im2=b2.mini;
 while(ih1<ih2||im1<im2)
 {
  if(ih1<ih2)
  {
   fc+=(60-im1)*toll[ih1%hour_num];
   ih1++;im1=0;
  }
  else
  {
   fc+=(im2-im1)*toll[ih1%hour_num];
   im1=im2;
  }
 }
 fc/=100;
 return fc;
}
void CA::run()
{
 int i,t,billnum;
 for(i=0;i<hour_num;i++)
 {
  cin>>t;
  toll.push_back(t);
 }
 cin>>billnum;
 billnode node;
 string s;
 while(billnum-->0)
 {
  cin>>node.name;
  cin>>node.mouth;getchar();
  cin>>node.date;getchar();
  cin>>node.hour;getchar();
  cin>>node.mini;
  cin>>node.status;
  node.total=node.date*24*60+node.hour*60+node.mini;
  mbl[node.name].push_back(node);
 }
 map<string,vector<billnode> >::iterator im;
 for(im=mbl.begin();im!=mbl.end();++im)
 {
  sort(im->second.begin(),im->second.end());
 }
 for(im=mbl.begin();im!=mbl.end();++im)
 {
  if(im->second.size()>=2)
  {
   int ifirst=-1,i;
   ostringstream ostr;
   double ftotal=0,fcur;
   bool bsuc=false;
   ostr<<setfill('0');
   ostr<<im->second.begin()->name<<" "<<setw(2)<<im->second.begin()->mouth<<endl;
   for(i=0;i<im->second.size();i++)
   {
    if(i==-1||im->second[i].status=="on-line")
    {
     ifirst=i;
    }
    else if(ifirst!=-1&&im->second[i].status=="off-line")
    {
     fcur=getcharge(im->second[ifirst],im->second[i]);
     ftotal+=fcur;
     ostr<<setw(2)<<im->second[ifirst].date<<":"<<setw(2)<<im->second[ifirst].hour<<":"<<setw(2)<<im->second[ifirst].mini;
     ostr<<" ";
     ostr<<setw(2)<<im->second[i].date<<":"<<setw(2)<<im->second[i].hour<<":"<<setw(2)<<im->second[i].mini;
     ostr<<" ";
     ostr<<im->second[i].total-im->second[ifirst].total;
     ostr<<" ";
     ostr<<fixed<<setprecision(2)<<"$"<<fcur<<endl;
     ifirst=-1;
     bsuc=true;
    }
   }
   ostr<<"Total amount: $"<<ftotal<<endl;
   if(bsuc) cout<<ostr.str();
  }
 }
}

int main()
{
// freopen("test.in","r",stdin);
 CA *a=new CA;
 a->run();
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值