您的位置:首页 > 其它

poj 1852

2017-06-03 22:07 253 查看
题目大意:

n只蚂蚁在l长的杆子上爬,各个蚂蚁方向不一样,碰头后会调转方向继续爬,每秒钟一个长度,然后问所有蚂蚁爬下杆子的最长和最短时间;

基本思路:

两只蚂蚁碰头后各自调转方向相当于彼此穿过,所以情况就转化的更简单了;首先各个蚂蚁的方向是不知道的,然后用二分找长度中间值,因为所有蚂蚁都掉下杆子的最小时间情况就取决与这两只蚂蚁,让他们的相对位置在左边的方向向左,右边的方向向右,最长时间情况取决于最左边和最右边蚂蚁,然后让最左边的向右,最右边的向左,这里由于长度的奇偶问题,就用upper——bound来找出下标;

代码如下:

#include<iostream>

#include<iomanip>

#include<algorithm>

#include<queue>

#include<stack>

#include<list>

#include<set>

#include<map>

#include<vector>

#include<cstring>

#include<cstdio>

using namespace std;

const int maxn = 10000+10;

int ans[maxn];

int main()

{

    int times;

    scanf("%d",×);

    while(times--)

    {

        int length,num;

        scanf("%d%d",&length,&num);

        for(int i=0;i<num;i++)

        {

            scanf("%d",&ans[i]);

        }

        sort(ans,ans+num);

        int mid=(length+1)/2;

        int right=upper_bound(ans,ans+num,mid)-ans;

        int left=right-1;

        int minx=max(ans[left],length-ans[right]);

        int maxx=max(length-ans[0],ans[num-1]);

        printf("%d %d\n",minx,maxx);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 想象力