京东2017机试题目总结

站队

有一条很长的队伍,队伍里面一共有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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值