Time Limit: 1000MS |
|
Memory Limit: 30000K |
Total Submissions: 12607 |
|
Accepted: 5525 |
Description
Input
Output
Sample Input
2
10 3
2 6 7
214 7
11 12 7 13 176 23 191
Sample Output
4 8
38 207
题意:在一根长为L的水平木棍上有一群数量为n的蚂蚁,它们以每秒1cm/s的速度走到木棍一端就会掉下去。现在知道它们的起始位置是距离木根左端点的x处。但是不知道它们爬行的方向。在相向而行的两只蚂蚁相遇后,它们会掉头往反方向走。问所有蚂蚁都落下木棍的最快时间和最慢时间。
题解:一开始觉得可以暴搜,每只蚂蚁只有两种情况,不过掉头的事情感觉很复杂。时间复杂度为2的n次幂。肯定超时。 因为是同时出发的,相遇时的两只蚂蚁用的时间是相同的,我们可以无视蚂蚁的区别,当两只蚂蚁相遇时它们保持原样交错而行。这样每只蚂蚁都是独立运动的,那么只要找每只蚂蚁掉下去的时间就行了。
代码如下:
#include<cstdio> #define maxn 1000100 int a[maxn],ansmin,ansmax,L,n; int MIN(int a,int b) { return a<b?a:b; } int MAX(int a,int b) { return a>b?a:b; } void ansMIN() { int i,min; ansmin=-1; for(i=0;i<n;++i) { min=MIN(a[i],L-a[i]); if(min>ansmin) ansmin=min; } printf("%d ",ansmin); } void ansMAX() { int i,max; ansmax=-1; for(i=0;i<n;++i) { max=MAX(a[i],L-a[i]); if(max>ansmax) ansmax=max; } printf("%d\n",ansmax); } int main() { int i,t; scanf("%d",&t); while(t--) { scanf("%d%d",&L,&n); for(i=0;i<n;++i) scanf("%d",&a[i]); ansMIN();//求所有蚂蚁掉下去的最短时间 ansMAX();//求所有蚂蚁掉下去的最长时间 } return 0; }