题目大意:在一根极细的杆子上,有许多蚂蚁在爬,他们爬的方向未知(有可能是右边,也有可能是左边)。若碰到杆子的两端他们便会掉落。如果他们相遇,由于杆子太细,他们不能越过对方过去,只能掉头回去。问所有蚂蚁掉落杆子所需的最短时间与最长时间。
分析:由于这题数据很大,搜索肯定会超时。换一种思路,如果他们都是同方向,那么久不存在最短时间。所以,当他们相遇时,他们之前所用时间相同,相遇的位置是同一点。之后的掉头可看成是两只蚂蚁交错(即越过对方),效果是一样的。这样只需查找每只蚂蚁到杆子两端的最长时间与最短时间便可。
#include<iostream> #include<stdio.h> #include<math.h> #define INT 0x3f3f3f3f using namespace std; int main(){ int t; cin>>t; while(t--){ int l,n; scanf("%d %d",&l,&n); int a[100000]; int mint=0; for(int i=0;i<n;i++){ scanf("%d",&a[i]); mint=max(mint,min(a[i],l-a[i])); } int maxt=0; for(int i=0;i<n;i++){ maxt=max(maxt,max(a[i],l-a[i])); } printf("%d %d\n",mint,maxt); } }
poj-problem01