大疆笔试-最少充电时间

题目很复杂,但是直接暴力dfs就行

注意递归条件,要考虑到每一种充电时间

本来想记忆化一下,没想到暴力直接A了


#include<map>
#include<vector>
#include<iostream>
using namespace std;


class Solution {
public:
    map<int,vector<pair<int,int>>> disMap;
    int maxResult=100086;
    void getResult(int allCost,int nowCharge,int dis,int now,int target,vector<int>charge,vector<bool>&visit,vector<vector<int>>&dp){
        if(now==target){
            maxResult=maxResult>allCost?allCost:maxResult;
            return;
        }
        for(auto p:disMap[now]){
            int next=p.first;
            int nextDis=p.second;
            if(visit[next]){
                continue;
            }
            visit[next]=true;
            int leastDis=0;
            // 至少要充一下电,保证有电上路
            if(nextDis>nowCharge){
                leastDis=(nextDis-nowCharge)*charge[now];
            }
            // 1. 开始遍历各种充电方案
            int maxV=nextDis>nowCharge?nextDis:nowCharge;
            for(int i=dis;i>=maxV;i--){
			  //allCost+leastDis+(i-maxV)*charge[now]+nextDis
			  //—— leastDis:最少充电时间
			  //——i-maxV:多冲的千米数
			  //——nextDis:跑到下一个点花的时间
                getResult(allCost+leastDis+(i-maxV)*charge[now]+nextDis,i-nextDis,dis,next,target,charge,visit,dp);
            }
            visit[next]=false;
        }
    }
    int car_plan(vector < vector < int > > paths, int dis, int a, int b, vector < int > charge) {
        if(a==b){
            return 0;
        }
        int n=paths.size();
        for(int i=0;i<n;i++){
            int s=paths[i][0];
            int e=paths[i][1];
            int dis=paths[i][2];
            disMap[s].push_back({e,dis});
            disMap[e].push_back({a,dis});
        }
        int m=charge.size();
        vector<vector<int>>dp(n,vector<int>(n,0x3f3f3f3f));
        vector<bool>visit(m,false);
        visit[a]=true;
        getResult(0,0,dis,a,b,charge,visit,dp);
        return maxResult;
    }
};
int main() {
    int res;


    int paths_rows = 0;
    int paths_cols = 0;
    cin >> paths_rows >> paths_cols;
    vector< vector < int > > paths(paths_rows);
    for(int paths_i=0; paths_i<paths_rows; paths_i++) {
        for(int paths_j=0; paths_j<paths_cols; paths_j++) {
            int paths_tmp;
            cin >> paths_tmp;
            paths[paths_i].push_back(paths_tmp);
        }
    }
    int dis;
    cin >> dis;






    int a;
    cin >> a;






    int b;
    cin >> b;






    int charge_size = 0;
    cin >> charge_size;


    vector<int> charge;
    int charge_item;
    for(int charge_i=0; charge_i<charge_size; charge_i++) {
        cin >> charge_item;


        charge.push_back(charge_item);
    }




    Solution *s = new Solution();
    res = s->car_plan(paths, dis, a, b, charge);
    cout << res << endl;


    return 0;


}
'''

全部评论
这题我0%😅第一道87%
2 回复 分享
发布于 2023-08-13 20:33 辽宁
30分钟做,一眼就是写不完,直接骗20分做米哈游😭
1 回复 分享
发布于 2023-08-13 22:10 广东
同dfs直接a了
1 回复 分享
发布于 2023-08-13 20:40 北京
写了dp 20%
1 回复 分享
发布于 2023-08-13 20:39 陕西
DP 60
1 回复 分享
发布于 2023-08-13 20:36 四川
我是***…第二题写了1个小时dp,20分
1 回复 分享
发布于 2023-08-13 20:35 河北
大疆的数据好水啊hh
点赞 回复 分享
发布于 2023-08-13 20:59 浙江

相关推荐

Cherrycola01:0实习 0项目 约等于啥也没有啊 哥们儿这简历认真的吗
点赞 评论 收藏
分享
评论
2
6
分享

创作者周榜

更多
牛客网
牛客企业服务