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 }

 

posted @ 2016-09-21 14:45  马丁黄瓜啊  阅读(175)  评论(0编辑  收藏  举报