华为笔试没全通过,大佬请留言

题目描述
随着移动互联网的发展,人们的出行方式也变得越来越方便,相信很多人都用过手机打车软件,请你设
计一个简单的订单调度系统,当用户打车时能够计算出最快接到乘客的司机。
乘客叫车时,系统获取出当前区域内司机情况如下:
1.乘客到各个司机的路程长度分别是D1、D2. .DN,单位是米。
2.这些路程中可能存在拥堵路段,各司机路程中的拥堵长度分别是C1、C...CN, 如果到某司机的路段
不存在拥堵,则值为0。
3.路程中还可能存在红绿灯路口,各司机路程经过的红绿灯的个数分别是L1、L..L.N, 如果无红绿灯
则为0,假设每个红绿灯路口碰到红灯的概率都为50%,每个红灯要等待15秒。
4.所有司机在正常路段的行驶速度是10m/s,在拥堵路段的行驶速度是2m/s.
5.各个司机评分级别分别是L1、L2、 ..L.N. 评分等级反映服务质量,是1-10的整数。
调度系统需综合考虑接载速度和服务质量,假设通过以上数据计算得到最快接载司机是M司机,其用时
为T,单位是秒,如果在[T,T+60)时间范围内存在评分级别更高的司机,则安排该时间范围内评分更高的
司机接载。

 


输入描述:
输入包括4行数据,格式说明如下:
第1行是乘客到各司机的路程长度,都是整数,用英文半角逗号分隔。第1个整数表示1号司机的距
离,第2个整数表示2号司机的距离,以此类推●
第2行是各司机路程中的拥堵路段长度,都是整数,用英文半角逗号分隔。与第一行对应,按照司机
编号排列●
第3行是各司机路程中红绿灯路口的个数,都是整数,用英文半角逗号分隔。与第一行对应,按照司
机编号排列●
第4行是各司机的评分等级,共有10级,分别用整数1到10表示,数字越大表示级别越高,服务质量;
越好。与第一行对应,按照司机编号排列●
输出描述:
输出系统所计算出的接单的司机编号(司机编号从1开始)及其接载所用时长(单位是秒),用逗号
分隔.例如: 4,398●

输入
1530, 1760, 2300, 1990
240,320,0,0
2,1,0,0
8,10,10,9
输出
3,230
 

#include <stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<limits.h>
#include<queue>
#include<stack>
#include<map>
#include <math.h>
using namespace std;

vector<int> get_input(){
    string s;
    cin>>s;
    int sum=0;
    s=s+",";
    vector<int> v;
    for(int i=0;i<s.size();i++){
        if(s[i]!=','){
            sum=sum*10+(s[i]-'0');
        }
        else{
            v.push_back(sum);
            sum=0;
        }
    }
    return v;
}
bool cmp(vector<int> a,vector<int> b){
    if(a[0]!=b[0]) return a[0]<b[0];
    else return a[1]<b[1];
}
int main(){
    vector<int> distance=get_input();
    vector<int> jam=get_input();
    vector<int> light=get_input();
    vector<int> quality=get_input();
    int n=jam.size();
    vector<vector<int>> time(n,vector<int>(3,0));
    int min_time=INT_MAX,q,res_q;
    for(int i=0;i<n;i++){
        time[i][0]=(jam[i])*1.0/2+(distance[i]-jam[i])*1.0/10+light[i]*15;
        time[i][1]=quality[i];
        time[i][2]=i;
        if(time[i][0]<min_time) {
            min_time=time[i][0];
            q=time[i][1];
            res_q=time[i][2];
        }
    }
    sort(time.begin(),time.end(),cmp);
    int res_time=min_time;
    for(long long int i=1;i<n;i++){
        if(time[i][0]<min_time+60){
            if(time[i][1]>q){
                res_time=time[i][0];
                res_q=time[i][2];
                q=time[i][1];
            }
            
        }
        else break;
    }
    cout<<res_q+1<<","<<res_time<<endl;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱桃木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值