其他分享
首页 > 其他分享> > SCAU-18946 小美的送花路线

SCAU-18946 小美的送花路线

作者:互联网

Description

美团2021校招笔试-编程题(通用编程试题,第1场) 
小美是美团的一名鲜花快递员,鲜花是一种保质期非常短的商品,所以需要尽快送到客户手中。

公司对于骑手的一个要求就是要规划送花的线路,使得骑手送完所有订单走的路程尽可能少。

(骑手开始派送时带走了所有需要派送的花,不必每单后返回花店,路程结算是从花店出发,到送完最后一名客户为止,不计算从最后一名客户家回到花店的时间)

公司对于骑手的绩效评价是取决于两个指标,一是从花店到所有客户地址的距离之和,另一个是骑手实际走的路程。

设花店始终位于1号位置,客户共有n-1个,其编号为2...n。令dis(i,j)表示i号位置到j号位置的距离,

即分别计算dis(1,2)+dis(1,3)+.....+dis(1,n)的总和, 以及骑手实际所走的最短路程。

为了简化问题,我们约束这n个位置构成的是一棵树,即只有n-1条边在其中互相连接,且保证n个点彼此连通。

输入格式

输出第一行包含一个正整数n,即花店和客户的总数。(1<=n<=100000)

接下来有n-1行,每行有三个整数u,v,w,表示在u和v之间存在一条距离为w的道路。(1<=w<=1000)

输出格式

输出包含两个整数,中间用空格隔开,分别表示花店到所有客户地址的距离之和和骑手实际走的路程。

 

输入样例

5
1 2 3
1 3 1
1 4 2
2 5 1

 

输出样例

10 10

 

思路:

我们可以看到一棵树,需要求

sum1:花店到所有客户的地址。 sum2:骑手最短路径

输入u v w,以1-2-5路径为例,我们可以看到,1-5的距离由1-2和2-5构成,即dp[5]=dp[2]+w;

对于任意的节点我们都可以写出dp[v]=dp[u]+w的柿子;就可以很轻易的求出sum1;

对于sum2, 可以这样入手,骑手的路程分为,S1:去的路程,S2:回来的路程,那么sum2=S1+S2;

题目提出,最后一段路程S3无需计入,则有sum2= S1+S2-S3;

那么很清晰了,题目是一棵树,理论上来回走同一条路有S1=S2;S1=w1+w2+w3......那么我们只需求出最大的S3即可。

这样分析是不是一点也不难了呢(>-<);

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

int  main() {
    int n = 0;
    cin >> n;
    vector<int>a(n+1,0);
    int sum = 0, maxlen = 0, sum2 = 0;
    int u, v, w;
    for (int i = 1; i <n;i++) {
        cin >> u >> v >> w;
        a[v] = a[u] + w;    
        sum += w * 2;
        maxlen = max(a[v], maxlen);
        sum2 += a[v];
    }
    cout << sum2 << " " << sum - maxlen;

}

 

标签:路程,花店,18946,int,S1,美的,sum2,骑手,SCAU
来源: https://blog.csdn.net/m0_50995108/article/details/116172618