题意:输入多种车的事故赔偿价格、租车起步价、每千米单价,输入多个人的多种事件(租车、还车、发生事故),按名字字典序输出每个人的总费用,如果信息不完整或不合法输出“inconsitent"(租车、事故、还车的顺序得对,一个人同时期不能租多辆车,租车还车要完整不能只租不还或没租却还)
分析:这题就是一个简单的模拟,复杂在我不知道怎么用string做关键字,知道了map,一切都好办了。小trick:一个人可以多次租车还车。
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<string> #include<cstring> #include<map> using namespace std; int t,n,m; struct node1{ int a,b,c; }; struct node2{ int time; string a,b; int state,ans; string car; node2(int state=0,int ans=0):state(state),ans(ans){} }; map<string,node1> car; map<string,node2> man; int main() { cin>>t; while(t--){ car.clear(); man.clear(); cin>>n>>m; string s; int a,b,c; while(n--){ cin>>s>>a>>b>>c; car[s].a=a; car[s].b=b; car[s].c=c; } string x,y,z; while(m--){ cin>>a>>x>>y>>z; man[x].a=y,man[x].b=z; if(man[x].state!=-1){ if(y=="p"){ if(man[x].state==0||man[x].state==2){ man[x].state=1; man[x].car=z; man[x].ans+=car[z].b; } else{ man[x].state=-1; } } else if(y=="r"){ if(man[x].state==1){ man[x].state=2; int ans=0; for(int i=0;i<z.size();i++){ ans=ans*10+(z[i]-'0'); } man[x].ans+=ans*car[man[x].car].c; } else man[x].state=-1; } else if(y=="a"){ if(man[x].state==1){ int ans=0; for(int i=0;i<z.size();i++){ ans=ans*10+(z[i]-'0'); } man[x].ans+=(int)ceil((double)ans*car[man[x].car].a/100); } else man[x].state=-1; } } } map<string,node2>::iterator it; for(it=man.begin();it!=man.end();it++){ if(((*it).second.state!=2)) cout<<(*it).first<<" INCONSISTENT"<<endl; else cout<<(*it).first<<" "<<(*it).second.ans<<endl; } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-21 13:12:34