站队
有一条很长的队伍,队伍里面一共有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