题目大意:给出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\n"); 31 continue; 32 } 33 if(k<=a[1])//如果起始坐标在最左边,则达到第n-1个点结束 34 { 35 printf("%lld\n",a[n-1]-k); 36 continue; 37 } 38 else if(k>=a[n])//如果起始坐标在最右边,则到达第二个点结束 39 { 40 printf("%lld\n",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\n",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\n",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\n",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\n",ans); 83 } 84 } 85 return 0; 86 }
时间: 2024-10-01 13:08:27