首页 > 其他 > 详细

1095 Cars on Campus (30分)

时间:2020-03-08 09:19:21      阅读:98      评论:0      收藏:0      [点我收藏+]

1. 题目

技术分享图片

2. 思路

  1. 先按照车排序
  2. 找出符合要求的in, out
  3. 求出每辆车的时间
  4. 把符合要求的数据按照时间排序
  5. 按照in、out,求出每个时间点的车数
  6. 按照要求输出

3. 注意点

4. 代码

#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<iostream> 

// 23:17 - 1:03
using namespace std;

struct car{
    string name;
    int hh;
    int mm;
    int ss;
    string status;
    car(char* name, int hh, int mm, int ss, char* status){
        this->name = name;
        this->hh = hh;
        this->mm = mm;
        this->ss = ss;
        this->status = status;
    }
};

int n, k;
vector<car> cars;
vector<car> car2;
map<string, int> alltime; 

int caldiff(car a, car b){
    int time1 = a.hh * 60 * 60 + a.mm * 60 + a.ss;
    int time2 = b.hh * 60 * 60 + b.mm * 60 + b.ss;
    return time1>time2?time1-time2:time2-time1;
}

string timetostring(int time){
    int hh = time/3600;
    int mm = time%3600/60;
    int ss = time%60;
    char str[20];
    sprintf(str, "%02d:%02d:%02d", hh, mm, ss);
    return str;
}

bool cmp(car a, car b){
    if(a.name != b.name){
        return a.name < b.name; 
    }
    if(a.hh != b.hh){
        return a.hh < b.hh;
    }
    if(a.mm != b.mm){
        return a.mm < b.mm;
    }
    return a.ss < b.ss;
}

bool cmp2(car a, car b){
    if(a.hh != b.hh){
        return a.hh < b.hh;
    }
    if(a.mm != b.mm){
        return a.mm < b.mm;
    }
    return a.ss < b.ss;
}

string gettime(car a){
    char str[20];
    sprintf(str, "%02d:%02d:%02d", a.hh, a.mm, a.ss);
    return str;
}

int main(){
    scanf("%d %d", &n, &k);
    for(int i=0;i<n;i++){
        char name[100], status[10];
        int hh, mm, ss;
        scanf("%s %d:%d:%d %s", name, &hh, &mm, &ss, status);
        cars.push_back(car(name ,hh ,mm, ss, status));
    }
    sort(cars.begin(), cars.end(), cmp); 
    
    // 获得有效数据,存入car2 
    int i = 0, j = 0;
    while(1){
        for(i=j,j++;j<n;j++){
            if(cars[j].name != cars[j-1].name){
                break;
            }
        }
        for(;i<j-1;i++){
            if(cars[i].status == "in" && cars[i+1].status == "out"){
                car2.push_back(cars[i]);
                car2.push_back(cars[i+1]);
                i++;
            }
        }
        if(j == n){
            break;
        }
    }
    
    // 计算没辆车的停车时间s 
    for(i=0;i<car2.size()-1;i+=2){
        alltime[car2[i].name] += caldiff(car2[i], car2[i+1]);
    }
    
    // 按照时间排序 
    sort(car2.begin(), car2.end(), cmp2);
    
    // 计算每个时间点的车数 
    int count = 0;
    map<string, int> time_;
    for(auto a:car2){
        if(a.status == "in"){
            count++;
            time_[gettime(a)] = count;
        }else{
            count--;
            time_[gettime(a)] = count;
        }
    }

    // 输出车数 
    auto it = time_.begin();
    for(i=0;i<k;i++){
        int hh, mm, ss;
        scanf("%d:%d:%d", &hh, &mm, &ss);
        char sss[20];
        sprintf(sss, "%02d:%02d:%02d", hh, mm, ss);
        string str = sss;
        
        for(;it!=time_.end() && str>=it->first;it++);
        
        if(it == time_.begin()){
            printf("0\n");
        }else{
            advance(it, -1);
            printf("%d\n", it->second);
        }
    }
    
    // 获得最大时间的车 
    int maxtime = -1;
    for(auto a:alltime){
        if(a.second > maxtime){
            maxtime = a.second;
        }
    }
    vector<string> maxname;
    for(auto a:alltime){
        if(a.second == maxtime){
            maxname.push_back(a.first);
        }
    }
    
    // 按名字排序 
    sort(maxname.begin(), maxname.end(), [](string a, string b){
        return a<b;
    });
    
    // 输出 
    for(auto a:maxname){
        printf("%s ", a.data());
    }
    printf("%s", timetostring(maxtime).data());
}

1095 Cars on Campus (30分)

原文:https://www.cnblogs.com/d-i-p/p/12439692.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!