題目大意:很多的螞蟻都在長度為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的距離,當螞蟻數量增加時,情況相同。
則需要時間最長的的就是讓距離端點最近的螞蟻爬到另一個端點(最遠)所需要的時間。
也就是說,只要找出所有螞蟻與較遠端比較,然后找出最大值就是所需要的最大時間。
這里需要注意的就是兩只螞蟻相遇轉向的那個梗。事實上,可以知道兩只螞蟻相遇后,當他們保持原樣交錯而過繼續(xù)前進也不會有任何問題。這樣看來,可以認為每只螞蟻都是獨立運動的,所以要求最長時間,只要求螞蟻到桿子端點的最大距離就好了。
#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;
}
#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;
}