【POJ 1852】Ants(思维)

本文探讨了一道关于两只蚂蚁在直线上相向而行,相遇后改变方向继续行走的问题。通过对蚂蚁行走轨迹的分析,提出了一个巧妙的解决策略,即通过计算蚂蚁运动的最短和最长时间来简化问题,避免了复杂的碰撞处理。文章提供了详细的思路解析和C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

神奇的原因,又没法复制题目,一复制就说我非原创。
给大家个链接
题目传送门

思路

这题,就是一道智力冲浪题 (水题)
做了这道题,我想起了洛谷的一句话。

有些问题刚开始觉得无从下手。好好想一想,尽量别看题解,否则你会大呼“简单”。

蚂蚁数上限 1000000 1000000 1000000,爬行方式 2 1000000 2^{1000000} 21000000种。
(默默放弃这一题)
这一题,两只蚂蚁碰面后,会转身再走。
emmmm,给大家看两幅盗来的图。
(由于盗图,请忽略引号)

本来两只蚂蚁的行走轨迹:
在这里插入图片描述
相遇转身后:
在这里插入图片描述
(换魂大法好!)
这不就相当于没有转身这个限制了吗。
于是,我们将每个蚂蚁的运动最短时间和最长时间都求出来,分别取最大值,就完事了。
很快活。

代码

#include <cstdio>
#include <iostream>
#include <cstring>
#include <iomanip>
#include <string>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <map>
#include <list>
#include <queue>
#include <istream>
#include <ostream>
#include <set>
#include <stack>
#include <cwctype>
#include <fstream>
#include <vector>
#include <cwchar>
#include <functional>

using namespace std;

int main() {
	int T; scanf("%d", &T);
	while (T--) {
		int l, n; scanf("%d%d", &l, &n);
		int ans1, ans2; ans1 = ans2 = 0;
		for (int i = 1, x; i <= n; i++) {
			scanf("%d", &x);
			ans1 = max(ans1, min(x, l-x));
			ans2 = max(ans2, max(x, l-x));
		}
		printf("%d %d\n", ans1, ans2);
	}
	return 0;
}

(请忽略我这些可爱的头文件)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值