POJ1852
我今天发现我不是一般的菜……还是思维太狭窄了
n只蚂蚁以每秒1cm的速度在长为Lcm的杆子上爬行。当蚂蚁爬到杆子上的端点时蚂蚁将会掉落,由于杆子太细,两只蚂蚁相遇时,他们不可能交错而过,只能各自向反方向爬去。对于每只蚂蚁,我们知道它对于左端点的距离为x,但不知道它的朝向,请计算所有蚂蚁都掉落的最短时间和最长时间。
输入
L = 10
n = 3
x{2, 6, 7}
输出
min = 4
max = 8
思路
这是一道模拟水题,但是如果没有思路的话,很容易会造成TLE,至于为什么是水题,因为它水就水在告诉你思路以后,这道题就不攻自破了。
题目中加粗的部分是出题人用来迷惑大家的,就因为这段话,我第一想法也是用穷举法把蚂蚁朝向的所有的情况都搜一遍,然后再输出。
这么做铁定会超时,当我们深入思考后就发现,如果把两只蚂蚁只看成质点,忽略两只蚂蚁碰头后就按反方向走的情况,就可以当作是两只蚂蚁穿过对方继续按照原路走,这样,我们就可以只研究每只蚂蚁距离端点的有多远而不是蚂蚁朝向外加每只蚂蚁行动的情况了。
需要注意的是,在所有蚂蚁掉落的时间最短的情况下,我们就需要把所有蚂蚁行动的最短时间求出来,然后再选出这些时间里最长的时间——因为必须要保证所有的蚂蚁全部掉下。
代码
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int l, n;
int ants[1000000] = {0};
int maxtime = 0, mintime = 0, t;
cin >> l >> n;
for (int temp = 0; temp < n; temp++)
cin >> ants[temp];
for (int temp = 0; temp < n; temp++){
maxtime = max(maxtime, ants[temp]);
maxtime = max(maxtime, l-ants[temp]);
t = min(l-ants[temp], ants[temp]); //所有蚂蚁全部掉下的最短时间
mintime = max(mintime, t);
}
cout << mintime << endl << maxtime;
return 0;
}