UVa 10714 & POJ 1852 & ZOJ 2376 - Ants

35 篇文章 0 订阅
25 篇文章 0 订阅

传送门UVa : UVa 10714 & POJ 1852- Ants

→→→POJ:UVa 10714 & POJ 1852- Ants


题意:把N只蚂蚁放在木板上,求它们全部掉下去的最长、最短时间。


不会处理蚂蚁碰头的情况,参考了shuangde800的解题报告

引用一下他的说明


对于每一只蚂蚁,它在棍子上面,距离左端点和右端点的距离可能是相等的也可能是不同的。暂时把距离远的那端叫做远端,距离近的那端叫做近端。


那么为了使得所有花时间最短,就要让所有的蚂蚁都往近端走,最后总间取决于所有蚂蚁中近端最远的那只蚂蚁,它的时间即是最小时间花费。


同理可推得,要使得所花时间最长,就要让所有蚂蚁都往远端走,这样最后长时间取决于所有蚂蚁中的远端最远的那只蚂蚁。


不用去考虑两只蚂蚁碰头的情况, 因为离远端最远的那只一定是在最右边或者最左边的那只蚂蚁,那么当它往远端方向走时,可能会碰到迎面走来的,那么他马上往回走,对面那只也往回走走,这就相当于“接力”过程,即对面那只蚂蚁替他走这一段本该由他走的路程(整个过程可能会有无数次“接力”,但最终结果都是一样的,只是这段最远路程变成由很多只蚂蚁一起完成)。
描述的有点挫,慢慢意会吧。


#include <cstdio>
#include <algorithm>
using namespace std;

int main()
{
    //freopen("input.txt", "r", stdin);
    int len, num, i, T, maxLen, temp, tempMax, minLen, tempMin;
    scanf("%d", &T);
    while (T--)
    {
        maxLen = minLen = -1;
        scanf("%d%d", &len, &num);
        for (i = 0; i < num; i++)
        {
            scanf("%d", &temp);
            tempMax = max(temp, len - temp);
            tempMin = min(temp, len - temp);
            minLen = max(tempMin, minLen);
            maxLen = max(tempMax, maxLen);
        }
        printf("%d %d\n", minLen, maxLen);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值