题目大意:有一个长度为lcm的木棍,上面有n只蚂蚁,以1cm/s的速度爬行,当两只蚂蚁相撞时两只蚂蚁各自掉头,蚂蚁走到两端时掉下去。不知道开始时每只蚂蚁各自的朝向,求全部蚂蚁都掉下去的可能最早时间和最晚时间。
这个和算是一个模型,不过这个简单一点,关键是从整体上看,蚂蚁“相撞掉头”和“擦肩而过”没有区别,在计算蚂蚁位置方面是等价的。所以,最早时间就是离中间最近的蚂蚁走到离它最近的一端的时间,最晚就是两端的蚂蚁走到离它更远的那一端的时间的较大者。
1 #include2 #include 3 #include 4 using namespace std; 5 #define MAXN 1000000+10 6 7 int ant[MAXN]; 8 9 int main()10 {11 #ifdef LOCAL12 freopen("in", "r", stdin);13 #endif14 int N;15 scanf("%d", &N);16 while (N--)17 {18 int l, n;19 scanf("%d%d", &l, &n);20 for (int i = 0; i < n; i++)21 scanf("%d", &ant[i]);22 sort(ant, ant+n);23 int latest = max (l-ant[0], ant[n-1]);24 double mid = 1.0 * l / 2;25 double lmin = fabs(ant[0]-mid);; // lmin save the nearest distance from the half of the pole26 int p = 0;27 for (int i = 1; i < n; i++)28 if (fabs(ant[i]-mid) < lmin)29 {30 lmin = fabs(ant[i]-mid);31 p = i;32 }33 int earliest = min(ant[p], l-ant[p]);34 printf("%d %d\n", earliest, latest);35 }36 return 0;37 }