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;
}
#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;
}
相关文章推荐
- PAT 甲级 1016. Phone Bills (25)
- 1016. Phone Bills (25)
- PAT 1016. Phone Bills (25)
- 1016. Phone Bills (25)
- 1016. Phone Bills (25)
- PAT (Advanced Level) Practise 1016. Phone Bills (25)
- 1016. Phone Bills (25)
- 1016. Phone Bills (25)
- pat 1016. Phone Bills (25)
- PAT A 1016. Phone Bills (25)【模拟】
- 1016. Phone Bills (25)_C
- PAT题解——1016. Phone Bills (25)
- 1016. Phone Bills (25)
- [PAT甲级]1016. Phone Bills (25)(统计用户每月电话账单)
- 1016. Phone Bills (25)
- PAT 1016. Phone Bills (25)
- PAT甲题题解-1016. Phone Bills (25)-模拟、排序
- 1016. Phone Bills (25)
- PAT 1016. Phone Bills (25)(map排序,去掉不匹配的,分时计算money)(待修改)
- 1016. Phone Bills (25)