有 n n n 个好朋友,每人有一辆遥控汽车和一个车库。第 i i i 个人有若干个长度为 d i d_i di 的玩具道路部件,可以为汽车建造道路。
两个朋友 a a a 和 b b b 可以建造一条长度为 d a + d b d_a+d_b da+db 道路以连接他们的车库。
我们认为,如果从任意一个车库出发能够到达任意的其他车库,我们称这种情况为“连通交通”。
请求出,构成一个“连通交通”所需要的最小总道路长度是多少?
第一行包含一个整数 n n n,表示朋友的人数。
第二行包含 n n n 个整数 d i d_i di,表示第 i i i 位朋友手中的道路部件的长度。
仅一行,输出成一个“连通交通”所需要的最小总道路长度。
1
10
0
3
5 5 5
20
4
7 3 3 5
24
【样例 1 解释】
当只有一位朋友时,已经构成“连通交通”,不必修建道路。故答案为 0 0 0。
【样例 3 解释】
如果在第 1 1 1 位和第 2 2 2 位朋友、第 2 2 2 位和第 3 3 3 位朋友、第 3 3 3 位和第 4 4 4 位朋友之间修建道路可以形成“连通道路”,价格总和为 ( 7 + 3 ) + ( 3 + 3 ) + ( 3 + 5 ) = 24 (7+3)+(3+3)+(3+5)=24 (7+3)+(3+3)+(3+5)=24。
【数据规模与约定】
本题采用子任务捆绑测试。
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 5 , 1 ≤ d i ≤ 1 0 9 1\le n\le10^5,1\le d_i\le 10^9 1≤n≤105,1≤di≤109。
【提示与说明】
本题分值按 COCI 原题设置,满分 50 50 50。
题目译自 COCI2021-2022 CONTEST #4 T1 Autići。
这道题的思路超级简单,稍微想一下就知道我们只要每一个都连在点权最小的点上就好,毕竟你要连通至少要连一条边吧,连通一条路的代价是 da + db,对于一个点 a,要连通它和其他点,就要让 db 尽量小,那不就连上点权最小的点就行了,然后这道题就结束了。直接上代码!(我才没有想要水题解)
#include
#include
#define maxn 100010
using namespace std;
template<typename T>void read(T &x){
x=0;
char c=getchar();
T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
long long n,sum;
long long d[maxn];
long long ans;
int main(){
read(n);
read(d[1]);
long long minn=d[1];
ans=d[1];
for(int i=2;i<=n;i++){
read(d[i]);
if(d[i]==d[i-1]) sum++;
ans+=d[i];
minn=min(minn,d[i]);
}
if(n==1){
printf("0\n");
return 0;
}
if(sum==n-1){
printf("%lld\n",2ll*d[1]*(n-1));
return 0;
}
ans=ans+1ll*(n-2)*minn;
printf("%lld\n",ans);
return 0;
}