G - Ants POJ - 1852(思维)

An army of ants walk on a horizontal pole of length l cm, each with a
constant speed of 1 cm/s. When a walking ant reaches an end of the
pole, it immediatelly falls off it. When two ants meet they turn back
and start walking in opposite directions. We know the original
positions of ants on the pole, unfortunately, we do not know the
directions in which the ants are walking. Your task is to compute the
earliest and the latest possible times needed for all ants to fall off
the pole. Input The first line of input contains one integer giving
the number of cases that follow. The data for each case start with two
integer numbers: the length of the pole (in cm) and n, the number of
ants residing on the pole. These two numbers are followed by n
integers giving the position of each ant on the pole as the distance
measured from the left end of the pole, in no particular order. All
input integers are not bigger than 1000000 and they are separated by
whitespace. Output For each case of input, output two numbers
separated by a single space. The first number is the earliest possible
time when all ants fall off the pole (if the directions of their walks
are chosen appropriately) and the second number is the latest possible
such time.

Sample Input
2
10 3
2 6 7
214 7
11 12 7 13 176 23 191
Sample Output
4 8
38 207
Sponsor

思路

  • 题意:给我们一根长度为l cm的水平木杆,有些🐜在上边以1cm/s 速度在木杆上走,并且我们我们🐜在木杆上的初始位置(木杆最左端为位置0),现在我们可以规定这些🐜的在木杆上走到方向,当两只🐜相遇的时候会各自掉头往反方向走,问这些🐜最长能在木杆上走多长时间?
  • 思路
  1. 对于最短时间:我们可以让所有的🐜总是往距离木杆进的那一端走,这样所有的蚂蚁并不会相遇,所以这个时候的时间就是 在所有🐜走下木杆的时间中,最大的那个就是ans
  2. 对于最大时间:表面上看我们让所有的🐜相遇的次数越多越好(这样往返耗费的时间多), 但是事实是这样吗???,我们假定所有的蚂蚁是完全一样的,请看下图
    在这里插入图片描述
    A、B 两只蚂蚁相遇并折返,可以看作相遇的不折返,我们将这个结论推广到所有的🐜,所以这个时候答案就是:所有蚂蚁都往距离木杆远的那一端走,那么 找出其中 耗时最大的那只蚂蚁所用的时间就是ans

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;

#define ll long long 
#define INF 0x3f3f3f3f
int l, n;


int main() {
    /* freopen("A.txt", "r", stdin); */
    /* freopen("Ans.txt", "w", stdout); */
    int t;
    scanf("%d", &t);
    while(t --)
    {
        scanf("%d %d", &l, &n);
        int mx = 0, mn = 0;
        int p;
        for(int i = 1; i <= n; i ++)
        {
            scanf("%d", &p);
            mn = max(mn, min(p, l - p));
            mx = max(mx, max(p, l - p));
        }
        printf("%d %d\n", mn, mx);
    }


    return 0;
}

总结:这样题表面上看,求最大时间很难,但是我们 我们将蚂蚁相遇折返 这个状态,换一个角度来考虑的话,真是化难为易

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值