2021-1-8

博客介绍了POJ1852这道编程题目,涉及蚂蚁在长杆上爬行并碰撞的情况。作者指出,尽管题目描述可能造成误解,但实际上可以通过简化问题来避免穷举,只需关注蚂蚁与端点的距离即可。通过计算每只蚂蚁到达端点的最短和最长时间,可以得到所有蚂蚁都掉落的最短和最长时间。文章提供了高效的C++代码实现,并强调了如何避免时间复杂度过高导致超时的问题。
摘要由CSDN通过智能技术生成

POJ1852

我今天发现我不是一般的菜……还是思维太狭窄了


n只蚂蚁以每秒1cm的速度在长为Lcm的杆子上爬行。当蚂蚁爬到杆子上的端点时蚂蚁将会掉落,由于杆子太细,两只蚂蚁相遇时,他们不可能交错而过,只能各自向反方向爬去。对于每只蚂蚁,我们知道它对于左端点的距离为x,但不知道它的朝向,请计算所有蚂蚁都掉落的最短时间和最长时间。

输入

L = 10
n = 3
x{2, 6, 7}

输出

min = 4
max = 8


思路
这是一道模拟水题,但是如果没有思路的话,很容易会造成TLE,至于为什么是水题,因为它水就水在告诉你思路以后,这道题就不攻自破了。

题目中加粗的部分是出题人用来迷惑大家的,就因为这段话,我第一想法也是用穷举法把蚂蚁朝向的所有的情况都搜一遍,然后再输出。
这么做铁定会超时,当我们深入思考后就发现,如果把两只蚂蚁只看成质点,忽略两只蚂蚁碰头后就按反方向走的情况,就可以当作是两只蚂蚁穿过对方继续按照原路走,这样,我们就可以只研究每只蚂蚁距离端点的有多远而不是蚂蚁朝向外加每只蚂蚁行动的情况了。

需要注意的是,在所有蚂蚁掉落的时间最短的情况下,我们就需要把所有蚂蚁行动的最短时间求出来,然后再选出这些时间里最长的时间——因为必须要保证所有的蚂蚁全部掉下。

代码

#include <iostream>
#include <algorithm>

using namespace std;
int main(){
    int l, n;
    int ants[1000000] = {0};
    int maxtime = 0, mintime = 0, t;
    cin >> l >> n;
    for (int temp = 0; temp < n; temp++)
        cin >> ants[temp];
    for (int temp = 0; temp < n; temp++){
        maxtime = max(maxtime, ants[temp]);
        maxtime = max(maxtime, l-ants[temp]);
        t = min(l-ants[temp], ants[temp]);   //所有蚂蚁全部掉下的最短时间
        mintime = max(mintime, t);
    }
    cout << mintime << endl << maxtime;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值