JulyRina's blog
welcome to July Rina's blog
posts - 22,comments - 1,trackbacks - 0
题目大意:很多的蚂蚁都在长度为L(cm)的杆子上爬行,它们的速度都是1cm/s,到了棒子终端的时候,蚂蚁就会掉下去。如果在爬行途中遇到其他蚂蚁,两只蚂蚁的方向都会逆转。已知蚂蚁在棒子的最初位置坐标,但是我们不知道他们会往哪一个方向爬。请求出所有蚂蚁掉下去的最短时间和最长时间。
题目分析:虽然当蚂蚁数量很多的时候情况会有很多种,但是先考虑小数量的分析就可以找到解决方法:如果只有两只的话,那么最短时间就是两只蚂蚁距离两端点距离较小的距离中取大者就是所需最短时间,而最长时间就是两只蚂蚁距离两端点距离较大者中取大者就是所需最长时间,例如,长度为10,一只在距离左端2的位置,一只在距离左端6的位置,则最短时间为max(min(2,10-2),min(6,10-6))为4,最长时间为max((max(2,10-2),max(6,10-6)))为8其实就是两只相向而行,当相遇后,都转为逆向,则时间为从相遇点到端点距离大者与相遇前所需时间,分析实际就是2到10的距离,当蚂蚁数量增加时,情况相同。
则需要时间最长的的就是让距离端点最近的蚂蚁爬到另一个端点(最远)所需要的时间。
也就是说,只要找出所有蚂蚁与较远端比较,然后找出最大值就是所需要的最大时间。
这里需要注意的就是两只蚂蚁相遇转向的那个梗。事实上,可以知道两只蚂蚁相遇后,当他们保持原样交错而过继续前进也不会有任何问题。这样看来,可以认为每只蚂蚁都是独立运动的,所以要求最长时间,只要求蚂蚁到杆子端点的最大距离就好了。
#include <cstdio>
#include <iostream>
using namespace std;

int min_time, max_time;
int h, n, T, tmp;

int main() {
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d" , &h, &n);
        min_time = 0;
        max_time = 0;
        for(int i=0;i<n;i++) {
            scanf("%d", &tmp);
            min_time = max(min_time, min(tmp, h - tmp));
            max_time = max(max_time, max(tmp, h - tmp));
        }
        printf("%d %d\n", min_time, max_time);
    }
    return 0;
}
posted on 2015-02-11 15:09 JulyRina 阅读(239) 评论(0)  编辑 收藏 引用 所属分类: 解题报告

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理