百度笔试题:
一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。
但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离?
输入描述:
输入一个正整数N, N <= 50。
接下来N个整数表示坐标,正数表示X轴的正方向,负数表示X轴的负方向。绝对值小于等于100
输出描述:
输出一个整数表示度度熊最少需要走的距离。
输入例子1:
4
1 4 -1 3
输出例子1:
4
思路:
首先计算出相邻两点之间的距离,并存入map中在找出找出哪个到前后点距离和最大的一个点,并记录距离和。
代码:
#include<iostream>
#include<vector>
#include<map>
using namespace std;
void length(vector<int> vec,int N){
map<int,int> tmp;
int ty=0;
//计算出两点之间的距离
for(int i=0;i<N-1;i++){
if(vec[i]<vec[i+1]){
tmp[i]=vec[i+1]-vec[i];
}else{
tmp[i]=vec[i]-vec[i+1];
}
}
int n=0,j=0;
//找出哪个到前后点距离和最大的一个点
for(int i=0;i<tmp.size()-1;i++){
int tmp2=tmp[i]+tmp[i+1];
if(tmp2>n){
n=tmp2; j=i;
}
}
for(int i=0;i<tmp.size();i++){
ty+=tmp[i];
}
//算出最短距离
if(vec[j]<vec[j+2]){
ty=ty-n+vec[j+2]-vec[j];
}else{
ty=ty-n+vec[j]-vec[j+2];
}
cout<<ty<<endl;
}
int main(){
vector<int> vec;
int N;cin>>N;
if(N<=50){
for(int i=0;i<N;i++){
int n;cin>>n;
if(n<0){
if(-1*n<=100);
vec.push_back(n);
}else{
if(n<=100)
vec.push_back(n);
}
}
length(vec,N);
}
return 0;
}