您的位置:首页 > 其它

1016 重要Phone Bills (25)

2014-02-22 19:52 197 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: