poj 1852 ants 题解《挑战程序设计竞赛》

地址  http://poj.org/problem?id=1852

题目描述

Description

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
复制代码

算法1

 

两只蚂蚁碰头后就各自回头 其实是一个思维陷阱, 它与两只蚂蚁碰头后就擦身而过是完全一样的
那么只要计算每次蚂蚁的最小路径选择与最大路径选择即可

复制代码
#include <iostream>
#include <algorithm>


using namespace std;


/*
Sample Input

2
10 3
2 6 7
214 7
11 12 7 13 176 23 191
Sample Output

4 8
38 207

*/
#define MAX_NUM  999999

int ants[MAX_NUM];

void Do(int ants[],int len,int num)
{
    int longLen =0, shortLen = 0;
    for (int i = 0; i < num; i++) {
        longLen = max(longLen, max(ants[i], len - ants[i]));
        shortLen = max(shortLen, min(ants[i], len - ants[i]));
    }

    cout << shortLen << " " << longLen << endl;
}

int main()
{
    int n = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int len = 0; int num = 0;
        cin >> len >> num;
        memset(ants,0,sizeof(ants));
        for (int j = 0; j < num; j++) {
            cin >> ants[j];
        }
        Do(ants,len,num);

    }
}
复制代码

 

posted on   itdef  阅读(234)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2018-08-10 cpp 区块链模拟示例(六) 交易
2014-08-10 stl string 小练习

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示