codeforces 709B Checkpoints
题目链接:http://codeforces.com/problemset/problem/709/B
题目大意:
第一行给出两个数 n,x。第二行 输入 n 个数。
要求:从x位置遍历 n-1 个位置,使得的距离最短。
解题思路:
1.如果n==1,则一个数也不用扫描,ans=0
2.否则 将数组排序,x所在的“ 合适 ”位置有两种可能
那么可以得出结果了,假定数放在一个数组na中
第一种可能 ans1= na[n-2]-na[0] + min( abs(na[0]-x), abs(na[n-2]-x) ) //na[n-2]-na[0] =>得到一遍的距离 min( abs(na[0]-x), abs(na[n-2]-x) ) =》得到往返多余的 较近距离
第二种可能 ans2= na[n-1]-na[1] + min( abs(na[n-1]-x),abs(na[n-1]-x) ) //同上
结果: min(ans1,ans2)
AC Code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+100; 4 int na[N]; 5 int main() 6 { 7 int n,x,i; 8 while(scanf("%d%d",&n,&x)!=EOF) 9 { 10 for(i=0; i<n; i++) 11 scanf("%d",&na[i]); 12 if(n==1)printf("0\n"); 13 else 14 { 15 sort(na,na+n); 16 int ans1,ans2; 17 ans1=na[n-1]-na[1]+min(abs(na[1]-x),abs(na[n-1]-x)); 18 ans2=na[n-2]-na[0]+min(abs(na[0]-x),abs(na[n-2]-x)); 19 printf("%d\n",min(ans1,ans2)); 20 } 21 } 22 return 0; 23 }