题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1861 一个研究生入学考试上机题==b
思路: 将信息放在结构体里,然后存在向量中, 最后扫描到n==0就统计,输出,清空向量。
需要注意的是 1 同一艘船可能出租两次,于是扫描到op=='E' 时,就要立马处理。
2 扫描到 op=='E' 时 ,还要看是否有S的记录,如果没有找到就不处理
3 从00:00 -> 00:00 算是借了一分钟~ 而不是差值0分钟
4 字符串和整数之间转化 用stringstream ,#include <sstream>
代码:
#include<iostream> #include<string> #include<vector> #include<map> #include<sstream> #include<cmath> using namespace std; struct info { int number; char op; string time; }; int stringtoint(string s) { int ans; stringstream ss; ss<<s; ss>>ans; return ans; } int main() { int n; vector<info> v; while(cin>>n) { info theinfo; char op; cin>>op; string time; cin>>time; if(n==-1) break; if(n==0) { int count=0; double ave=0; map<int,string> start; map<int,string> end; for(int i=0;i<v.size();i++) { if(v[i].op=='S') start[v[i].number]=v[i].time; else if(v[i].op=='E'&&start.find(v[i].number)!=start.end()) { count++; string starthour=start.find(v[i].number)->second.substr(0,2); string startminute=start.find(v[i].number)->second.substr(3,2); string endhour=v[i].time.substr(0,2); string endminute=v[i].time.substr(3,2); // 分钟计算小心一点 if(startminute<=endminute) ave+=stringtoint(endminute)-stringtoint(startminute); else { ave+=stringtoint(endminute)-stringtoint(startminute)+1; } ave+=(stringtoint(endhour)-stringtoint(starthour))*60; } } v.clear(); if(count!=0) ave=ave/count; cout<<count<<" "<<floor(ave)<<endl; } else { theinfo.time=time; theinfo.number=n; theinfo.op=op; v.push_back(theinfo); } } }