数据结构与算法刷题记录1
时间:4.28
这是第一次用优快云来记录自己的学习成果,在此留下纪念,希望自己能够坚持下去,变得更强。
本次学习记录来源于《挑战程序设计竞赛(第2版)》
Ants (POJNo.1852)
题目描述:
n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。对于每只蚂蚁,我们知道它距离竿子左端的距离x;,但不知道它当前的朝向。请计算所有蚂蚁落下竿子所需的最短时间和最长时间。
限制条件:
1 ≤ L ≤ 10^6
1 ≤ n ≤ 10^6
0 ≤ xi ≤ L
样例:
输入:
L = 10
n = 3
x = {2, 6, 7}
输出:
min = 4 {左、右、右}
max = 8 {右、右、右}
题目分析:
每只蚂蚁的朝向不确定,而且爬行途中遇到还会同时调转方向,但是可以通过找规律发现,就算两者调转方向也没关系,仍可以视作是没有改变方向,把每只蚂蚁当做是独立的个体,这样问题就变得好解决了。所有蚂蚁落下的最短时间就是找蚂蚁开始位置离杆最近一段的最长距离,把所有蚂蚁遍历一遍即可得到结果。最长时间同理,找蚂蚁距离杆最远一端的最长距离就可以了,这样时间复杂度就被缩减到了O(n),简直就是很爽啊。
参考代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int l, n;
cin >> l >> n;
int x[n];
for (int i = 0; i < n; i++) {
cin >> x[i];
}
int minT = 0;
for (int i = 0; i < n; i++) {
minT = max(minT, min(x[i], l - x[i]));
}
int maxT = 0;
for (int i = 0; i < n; i++) {
maxT = max(maxT, max(x[i], l - x[i]));
}
cout << "min = " << minT << endl;
cout << "max = " << maxT;
return 0;
}
本次刷题心得:
要学会冷静地分析题目,题目条件看似很复杂,其实细细一想是可以抽象出一个简化模型的。
本文记录了一次使用优快云进行学习成果分享的经历,内容涉及《挑战程序设计竞赛(第2版)》中的一道题目——Ants(POJNo.1852)。题目要求计算在不同情况下蚂蚁从竿子上掉落的最短和最长时间。博主通过分析得出,问题可简化为独立蚂蚁的最短和最长路径,实现了O(n)的时间复杂度解决方案。通过本次刷题,博主体会到了冷静分析和抽象模型在解题中的重要性。
5万+

被折叠的 条评论
为什么被折叠?



