jzoj 2158. 【2017.7.11普及】蚂蚁

本文介绍了一道关于蚂蚁在竿上爬行的问题,探讨了如何计算所有蚂蚁从竿上掉落所需的最短和最长时间。通过转换思路,将问题简化为寻找最接近中间点和两端点的蚂蚁位置,进而得出解决方案。

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

2158. 【2017.7.11普及】蚂蚁
(File IO): input:t1.in output:t1.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet

题目描述
n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。对于每只蚂蚁,我们知道它距离竿子左端的距离xi,但不知道它当前的朝向。请计算各种情况当中,所有蚂蚁落下竿子所需的最短时间和最长时间。
例如:竿子长10cm,3只蚂蚁位置为2 6 7,最短需要4秒(左、右、右),最长需要8秒(右、右、右)。

输入
第1行:2个整数N和L,N为蚂蚁的数量,L为杆子的长度(1 <= L <= 10^9, 1 <= N <= 50000)
第2 - N + 1行:每行一个整数A[i],表示蚂蚁的位置(0 < A[i] < L)

输出
输出2个数,中间用空格分隔,分别表示最短时间和最长时间。

样例输入
3 10
2
6
7

样例输出
4 8

数据范围限制
对于10%的数据n≤1
对于20%的数据n≤2
对于50%的数据n≤5
对于60%的数据n≤50
对于70%的数据n≤500
对于80%的数据n≤5000
对于100%的数据n≤50000

提示
数据有梯度,欢迎合理骗分。

#include <iostream>
#include <cstdio>
using namespace std;
    long long l,n,x,y,x1,y1,i,m;
int main()
{   
    //freopen("t1.in","r",stdin);
    //freopen("t1.out","w",stdout);
    cin>>n>>l;
    x1=y=l;
    for (i=1; i<=n; i++)
    {
        cin>>m;
        if (x<m&&m<l/2) x=m;
        if (l/2<m&&y>m) y=m;
        if (x1>m) x1=m;
        if (y1<m) y1=m;
    }
    if (l-y>x) x=l-y;
    if (l-x1>y1) y1=l-x1;
    cout<<x<<' '<<y1<<endl;
    //fclose(stdin);
    //fclose(stdout);
}

思路
考虑每只蚂蚁较复杂,我们可以试着转换思想,看成蚂蚁不回头,只会向前走。
分别找出最接近中间两边的点和最接近0和l的两个点,最后判断:
if (l-y>x) x=l-y;
if (l-x1>y1) y1=l-x1;
输出x(最小值)和y1(最大值)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值