跳伞兵

跳 伞 兵 跳伞兵

题目链接:luogu U72283

题目背景

在一次实战演练中,敌方已经入了目标领土,所以司令派跳伞兵落到作战区域,但要快速集合是很困难的,因此,司令找到了你来帮忙

题目

在一次实战中,司令要求跳伞兵们要跳 n ∗ n n*n nn的阵地中,士兵们的跳伞顺序按他们的编号(编号是自己来定的),每人的下降速度都是 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 n15 k100 m30
对于 50 % 50\% 50% 的数据,有 n ≤ 30   k ≤ 500   m ≤ 50 n ≤30\ k≤500\ m≤50 n30 k500 m50
对于 80 % 80\% 80% 的数据,有 n ≤ 40   k ≤ 1000   m ≤ 80 n ≤40\ k≤1000\ m≤80 n40 k1000 m80
对于 100 % 100\% 100% 的数据,有 n ≤ 65   k ≤ 4000   m ≤ 120 n ≤65\ k≤4000\ m≤120 n65 k4000 m120

思路

这道题是一道模拟题,十分的暴力。
我们直接暴力枚举每一个点为集合点,然后求出所要的时间。我们只要找出所要时间最少的那个点,它所要的时间,就是答案了。

代码

#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;
} 

后记

出题人大佬要我把他的这道题的博客也附上去:
大 佬 的 题 解 大佬的题解

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值