hdu 1861 游船出租 tag:模拟

题目地址: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);

     }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值