網易面試題——趕去公司
阿新 • • 發佈:2019-01-26
題目:
終於到週末啦!小易走在市區的街道上準備找朋友聚會,突然伺服器發來警報,小易需要立即回公司修復這個緊急bug。假設市區是一個無限大的區域,每條街道假設座標是(X,Y),小易當前在(0,0)街道,辦公室在(gx,gy)街道上。小易周圍有多個計程車打車點,小易趕去辦公室有兩種選擇,一種就是走路去公司,另外一種就是走到一個計程車打車點,然後從打車點的位置坐計程車去公司。每次移動到相鄰的街道(橫向或者縱向)走路將會花費walkTime時間,打車將花費taxiTime時間。小易需要儘快趕到公司去,現在小易想知道他最快需要花費多少時間去公司。
輸入描述:
輸入資料包括五行:
第一行為周圍計程車打車點的個數n(1 ≤ n ≤ 50)
第二行為每個計程車打車點的橫座標tX[i] (-10000 ≤ tX[i] ≤ 10000)
第三行為每個計程車打車點的縱座標tY[i] (-10000 ≤ tY[i] ≤ 10000)
第四行為辦公室座標gx,gy(-10000 ≤ gx,gy ≤ 10000),以空格分隔
第五行為走路時間walkTime(1 ≤ walkTime ≤ 1000)和taxiTime(1 ≤ taxiTime ≤ 1000),以空格分隔
輸出描述:
輸出一個整數表示,小易最快能趕到辦公室的時間
輸入例子:
2
-2 -2
0 -2
-4 -2
15 3
輸出例子:
42
分析:
因為是座標網格,所以總路徑的長度是固定值,所以,只需找出距離出發點最近的計程車打車點即可(還要排除掉直接走路去公司的情況)。
演算法程式碼:
int getDistance(Point & point1, Point & point2) { return abs(point1.getX() - point2.getX()) + abs(point1.getY() - point2.getY()); } int goToCompany(Point * taxi, int n, Point & home ,Point & company, int walkTime, int taxiTime) { vector<int> time(n+1); for (int i = 0; i < n; ++i) { time[i] = walkTime * getDistance(taxi[i], home) + taxiTime * getDistance(taxi[i], company); } time[n] = walkTime * getDistance(home, company); auto minTimeIter = min_element(time.begin(), time.end()); return *minTimeIter; }
測試程式碼:
//
// main.cpp
// goToCompany
//
// Created by Jiajie Zhuo on 2017/4/6.
// Copyright © 2017年 Jiajie Zhuo. All rights reserved.
//
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
class Point
{
private:
int _X;
int _Y;
public:
Point() : _X(0), _Y(0) {}
~Point() {}
void setX(int x) {this->_X = x;}
void setY(int y) {this->_Y = y;}
int getX() {return _X;}
int getY() {return _Y;}
};
int getDistance(Point & point1, Point & point2);
int goToCompany(Point * taxi, int n, Point & home ,Point & company, int walkTime, int taxiTime);
int main(int argc, const char * argv[]) {
int n;
cout << "Please enter the number of taxis: ";
cin >> n;
Point * taxi = new Point[n];
int tX;
cout << "Please input tX: ";
for (int i = 0; i < n; ++i) {
cin >> tX;
taxi[i].setX(tX);
}
int tY;
cout << "Please input tY: ";
for (int i = 0; i < n; ++i) {
cin >> tY;
taxi[i].setY(tY);
}
Point home;
Point company;
int gX, gY;
cout << "Please input gX and gY: ";
cin >> gX >> gY;
company.setX(gX);
company.setY(gY);
int walkTime, taxiTime;
cout << "Please input walkTime and taxiTime: ";
cin >> walkTime >> taxiTime;
int minTime = goToCompany(taxi, n, home, company, walkTime, taxiTime);
cout << "The minimum time of going to company is " << minTime << endl;
delete [] taxi;
return 0;
}
總結:
發現問題的關鍵點:總路徑的長度是固定值,所以問題轉化為了尋找(計程車)距離的最小值。