京东2017机试题目总结

来源:互联网 发布:鹿晗人品知乎 编辑:程序博客网 时间:2024/05/19 10:35

  • 站队
  • 终结者C

站队

有一条很长的队伍,队伍里面一共有n个人。所有的人分为三类:警察,小偷和普通人。将队伍里面的人从前到后由1到n编号,编号为i的人与编号为j的人的距离为i与j之差的绝对值。

每一个警察有一个能力值x,表示他能够监视与他距离不超过x的所有人,小偷被警察发现当且仅当他被一个或多个警察监视到。你知道在整条队伍中,一共有多少个小偷会被警察发现吗?

在【1】中有所有的2017年京东的题目。

这道题目,基本上看不出有什么难点,唯一的就是要注意效率,效率太低的话无法通过。

#include <iostream>#include <vector>using namespace std;int main() {    int num;    string str;    while( cin >> num >> str) {        if(num != str.size()) continue;        vector<bool> rec(false, num);        int res = 0;        for(int ind  = 0; ind < num; ind++ ) {            if(isdigit(str[ind])) {                int diff = str[ind] - '0';                int small = ind - diff >= 0? ind - diff:0;                int bigger = ind + diff < num?ind + diff: num-1;                for(int i = small; i <=  bigger; i++ ) {                    if(str[i] == 'X' ) {                        str[i] = '#';                        res++;                    }                }            }        }           cout << res<< endl;          }    return 0;} 

终结者C

收到情报,有批新造的机器人要运输到前线。小C将去破坏机器人的运输。小C将激光炮放置在公路的一旁,等运输车经过的时候发射(假设激光炮一定可以射穿车辆)。由于能源有限,激光炮只能发射两次。可以认为激光炮放在坐标轴的原点处,并向y轴正方向发射。每辆运输车可以看作是一个矩形,起始的x轴坐标为Xi ,所有的车均位于第一象限,长度为Li,速度为1,朝x轴负方向运动。即经过t时间后,该车车头的x坐标为Xi-t,车尾坐标为Xi-t+Li 。只要打中车的任何一个部分就算击中。

请你算算,他在哪两个时刻发射,才能摧毁最多的运输车【2】。

#include <iostream>#include <vector>using namespace std;bool isHit(int a1, int stt, int a2) {    return (a1 <= stt && a2 >= stt);}  int count_hit(int fst, int sed, int num_car, vector<pair<int, int>>& car, vector<int>& car_tail) {      int cnt_hit = 0;      for(int idx = 0; idx <  num_car; idx++)             if( isHit(car[idx].first, car[fst].first, car_tail[idx]) || isHit(car[idx].first, car[sed].first, car_tail[idx]))  cnt_hit++;               return cnt_hit;    }  void CountNumberOfHittedCar(void) {    int num_car, res = 0;    cin >> num_car; {        vector<pair<int, int>> car(num_car);        vector<int> car_tail(num_car, 0);        int a, b;        for(int ind = 0; ind < num_car; ind++)  {            cin.clear();            cin >> a >> b;            car[ind].first = a;            car[ind].second = b;            car_tail[ind] = a + b;        }          for(int fst = 0;  fst < num_car; fst++) {            for(int sed = 1; sed < num_car; sed++) {                int num_hit = count_hit(fst, sed, num_car, car, car_tail) ;                if(num_hit > res)  res = num_hit;               }          }      }    cout << res << endl;}  int main() {    CountNumberOfHittedCar();    return 0;}  

参考链接:
【1】京东机试题目:http://discuss.acmcoder.com/topic/58e78ec01a2f85620527f2d0
【2】终结者C:http://discuss.acmcoder.com/topic/58e78ec01a2f85620527f2d0

0 0
原创粉丝点击