1 codeforces 704B - Ant Man 贪心
2 题意:n个点,每个点有5个值,每次从一个点跳到另一个点,向左跳:abs(b.x-a.x)+a.ll+b.rr
3 向右跳:abs(b.x-a.x)+a.lr+b.rl,遍历完所有的点,问你最后的花费是多少
4 思路:每次选一个点的时候,在当前确定的每个点比较一下,选最短的距离。
5 为什么可以贪心?应为答案唯一,那么路径必定是唯一的,每个点所在的位置也一定是最短的。
6
7
8 #include <bits/stdc++.h>
9 using namespace std;
10 #define LL long long
11 const int inf = 0x3f3f3f3f;
12 const int MOD =998244353;
13 const int N =200010;
14 #define clc(a,b) memset(a,b,sizeof(a))
15 const double eps = 1e-7;
16 void fre() {freopen("in.txt","r",stdin);}
17 void freout() {freopen("out.txt","w",stdout);}
18 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}
19
20 struct node{
21 LL x;
22 LL rl,rr,ll,lr;
23 }p[5010];
24
25 LL fun(node a,node b){
26 if(b.x<a.x) return abs(b.x-a.x)+a.ll+b.rr;
27 return abs(b.x-a.x)+a.lr+b.rl;
28 }
29 LL net[5010];
30 int main(){
31 int n,a,b;
32 scanf("%d%d%d",&n,&a,&b);
33 for(int i=1;i<=n;i++) scanf("%I64d",&p[i].x);
34 for(int i=1;i<=n;i++) scanf("%I64d",&p[i].rl);
35 for(int i=1;i<=n;i++) scanf("%I64d",&p[i].rr);
36 for(int i=1;i<=n;i++) scanf("%I64d",&p[i].ll);
37 for(int i=1;i<=n;i++) scanf("%I64d",&p[i].lr);
38 LL tem,sum,ans=0;
39 int k;
40 net[a]=b;
41 ans+=fun(p[a],p[b]);
42 for(int i=1;i<=n;i++){
43 if(i==a||i==b) continue;
44 sum=1e18;
45 for(int j=a;j!=b;j=net[j]){
46 tem=fun(p[j],p[i])+fun(p[i],p[net[j]])-fun(p[j],p[net[j]]);
47 if(tem<sum){
48 sum=tem;
49 k=j;
50 }
51 }
52 ans+=sum;
53 net[i]=net[k];
54 net[k]=i;
55 }
56 printf("%I64d\n",ans);
57 return 0;
58 }