CodeForces 709B Checkpoints 模拟

题目大意:给出n个点的坐标,和你当前的坐标,求走过n-1个点的最短路程。

题目思路:走过n-1个点,为了使路程更短,那么不走的点只可能第一个点或最后一个点。模拟就行了,比较恶心。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<vector>
 5 #include<stdio.h>
 6 #include<stdlib.h>
 7 #include<queue>
 8 #include<math.h>
 9 #include<map>
10 #define INF 0x3f3f3f3f
11 #define MAX 10000005
12 #define Temp 1000000000
13 
14 using namespace std;
15 
16 long long a[MAX];
17 
18 int main()
19 {
20     int n,k,index,i,d;
21     long long lsum1,rsum1,lsum2,rsum2;
22     while(scanf("%d%d",&n,&k)!=EOF)
23     {
24         index=-1;
25         for(int i=1;i<=n;i++)
26             scanf("%lld",&a[i]);
27         sort(a+1,a+n+1);
28         if(n==1)//如果只有一个点,输出0
29         {
30             printf("0
");
31             continue;
32         }
33         if(k<=a[1])//如果起始坐标在最左边,则达到第n-1个点结束
34         {
35             printf("%lld
",a[n-1]-k);
36             continue;
37         }
38         else if(k>=a[n])//如果起始坐标在最右边,则到达第二个点结束
39         {
40             printf("%lld
",k-a[2]);
41             continue;
42         }
43         else if(n==2)//如果只有两个点 
44         {
45             long long ans=min(k-a[1],a[2]-k);
46             printf("%lld
",ans);
47         }
48         else
49         {
50             for(int i=1;i<=n;i++)
51             {
52                 if(a[i]>k)
53                 {
54                     index=i-1;
55                     break;
56                 }
57             }
58             if(index>=n-1)
59             {
60                 lsum1=(k-a[1]);//不拿N点
61                 lsum2=(a[n]-k)*2+(k-a[2]);//不拿1点
62                 rsum1=(k-a[2])*2+(a[n]-k);//不拿1点
63                 long long ans=min(min(lsum1,lsum2),rsum1);
64                 printf("%lld
",ans);
65                 continue;
66             }
67 
68             else if(index<=2)
69             {
70                 lsum1=(a[n]-k);//不拿1
71                 lsum2=(k-a[1])*2+(a[n-1]-k);//不拿n
72                 rsum1=(a[n-1]-k)*2+(k-a[1]);//不拿n
73                 long long ans=min(min(lsum1,lsum2),rsum1);
74                 printf("%lld
",ans);
75                 continue;
76             }
77             lsum1=(k-a[1])*2+(a[n-1]-k);
78             lsum2=(a[n-1]-k)*2+(k-a[1]);
79             rsum1=(k-a[2])*2+(a[n]-k);
80             rsum2=(a[n]-k)*2+(k-a[2]);
81             long long ans=min(min(rsum1,rsum2),min(lsum1,lsum2));
82             printf("%lld
",ans);
83         }
84     }
85     return 0;
86 }
View Code
原文地址:https://www.cnblogs.com/alan-W/p/5932236.html