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