题目:http://poj.org/problem?id=1852
本题如果从常规的思想出发去解决问题是比较复杂的,而且时间复杂度会比较高,极有可能超时,但本书给出了一个非常巧妙的解法,程序简单易懂,所以我们在平时训练的过程中不能一味的最求速度,而要想清楚具体的思路或者是巧妙的方法。
一般考虑当两只蚂蚁在杠上运动时,蚂蚁相互间碰到后的运动情况,这个思路直接用“穿过去”的思想,非常巧妙
附上AC代码:
//Time = 157MS
#include <stdio.h>
#include <algorithm>//下面的max函数以及min函数
#include <iostream>
#include <cstring>//用memset函数对数组初始化要使用头文件cstring
using namespace std;
#define MAX_N 1000005//本题的数据量比较大,如果方法不行会超时
// 输入
int L, n;
int x[MAX_N];
void solve()
{
// 计算最短时间
int minT = 0;
for (int i = 0; i < n; i++)
{
minT = max(minT, min(x[i], L - x[i]));//小中取大
}
// 计算最长时间
int maxT = 0;
for (int i = 0; i < n; i++)
{
maxT = max(maxT, max(x[i], L - x[i]));//大中取大
}
printf("%d %d\n", minT, maxT);
}
int main()
{
int p;
scanf("%d", &p);
while(p--)
{
memset(x, 0, sizeof(x));
scanf("%d%d", &L, &n);
for(int i = 0; i < n; i++)
scanf("%d", &x[i]);
solve();
}
return 0;
}