跳 伞 兵 跳伞兵 跳伞兵
题目链接:luogu U72283
题目背景
在一次实战演练中,敌方已经入了目标领土,所以司令派跳伞兵落到作战区域,但要快速集合是很困难的,因此,司令找到了你来帮忙
题目
在一次实战中,司令要求跳伞兵们要跳 n ∗ n n*n n∗n的阵地中,士兵们的跳伞顺序按他们的编号(编号是自己来定的),每人的下降速度都是 5 m / s 5m/s 5m/s(样例都是整数),但要每个跳伞兵隔开 2 2 2秒才能跳。 但 n × n n×n n×n的战地都是平原,他们的任务是在任意一个地方,用最快的时间集合在一起(一个点上)
注意:只要一落地就可以去集合点了
但是跳伞兵兵是专业训练过的,他们在 4 4 4个方向都可以移动,但移动的速度是 1 1 1.
所以司令让你编出一个程序,让他们尽快集合,不然敌人就要过来了
输入
第一行两个数 n n n和 k k k; n n n表示 n × n n×n n×n的阵地, k k k表示多少个跳伞兵
第二行一个数,表示飞机上的跳伞兵距离地面的距离 m m m(数据保证是 5 5 5的倍数)
接下来 k k k行,每行两个数 q q q, p p p,表示跳伞兵的坐标:第几行,第几列
输出
输出最短的时间(包括跳伞时间)
输入样例
5 5
85
2 1
5 2
4 3
3 2
1 5
输出样例
25
数据范围
对于
30
%
30\%
30% 的数据,有
n
≤
15
k
≤
100
m
≤
30
n ≤15\ k≤100\ m≤30
n≤15 k≤100 m≤30;
对于
50
%
50\%
50% 的数据,有
n
≤
30
k
≤
500
m
≤
50
n ≤30\ k≤500\ m≤50
n≤30 k≤500 m≤50;
对于
80
%
80\%
80% 的数据,有
n
≤
40
k
≤
1000
m
≤
80
n ≤40\ k≤1000\ m≤80
n≤40 k≤1000 m≤80;
对于
100
%
100\%
100% 的数据,有
n
≤
65
k
≤
4000
m
≤
120
n ≤65\ k≤4000\ m≤120
n≤65 k≤4000 m≤120;
思路
这道题是一道模拟题,十分的暴力。
我们直接暴力枚举每一个点为集合点,然后求出所要的时间。我们只要找出所要时间最少的那个点,它所要的时间,就是答案了。
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n, m, high, x[4001], y[4001], ans = 2147483647, far[4001];
bool cmp(int x, int y) {//从大到小排序
return x > y;
}
void work(int i, int j) {
for (int k = 1; k <= m; k++)
far[k] = abs(i - x[k]) + abs(j - y[k]);//求出他们之间的距离
sort(far + 1, far + m + 1, cmp);//按距离排序
int an = 0;
for (int k = 1; k <= m; k++) {
an = max(an, far[k] + high + (k - 1) * 2);//求出最慢那个人的时间,也就是在这里集合所要的时间
}
ans = min(ans, an);//最慢时间最快的那个点,就是集合点,这个点的最慢时间就是答案
}
int main() {
scanf("%d %d %d", &n, &m, &high);//读入
for (int i = 1; i <= m; i++) {
scanf("%d %d", &x[i], &y[i]);//读入
}
high /= 5;//直接求出落地时间
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {//暴力枚举每一个汇合点
work(i, j);
}
printf("%d", ans);//输出
return 0;
}
后记
出题人大佬要我把他的这道题的博客也附上去:
大
佬
的
题
解
大佬的题解
大佬的题解