https://vjudge.net/problem/POJ-1852
给定一个竹竿,和一群蚂蚁,给定蚂蚁距离竹竿左端的距离。
蚂蚁的方向是未知的,速度都是1米一秒,如果相遇了他们会扭头反向走,问你最短的时间和最长的时间
1 穷竭搜索。。会超时的。
2 我发现了一个规律,但是还是一直wa。。还是没想明白怎么回事,后面我会把那个错的先交到这里,有时候在想。
1 ac代码(参考白书)
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int maxn=1000007;
int main()
{ std::ios::sync_with_stdio(false);
cin.tie(0);
int t;
int a[maxn];
int len,n;
cin>>t;
while(t--)
{ cin>>len>>n;
for(int i=1;i<=n;i++)
{ cin>>a[i];
}
int min1=-1;
for(int i=1;i<=n;i++)
{ min1=max(min1,min(a[i],len-a[i]));
}
int max1=-1;
for(int i=1;i<=n;i++)
{ max1=max(max1,max(a[i],len-a[i]));
}
cout<<min1<<" "<<max1<<endl;
}
return 0;
}
我的思路。
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1000006;
int main()
{ int t;
int len,m;
int b[maxn];
int a[maxn];
scanf("%d",&t);
while(t--)
{ scanf("%d%d",&len,&m);
for(int i=0;i<m;i++)
{ scanf("%d",&a[i]);
b[i]=abs(a[i]-len/2);
}
sort(a,a+m);
sort(b,b+m);
printf("%d ",len/2-b[0]);
int big=len-(a[m-1]+a[0]+(a[m-1]-a[0])%2)/2+((a[m-1]-a[0])/2+(a[m-1]-a[0])%2);
int small=(a[m-1]+a[0]+(a[m-1]-a[0])%2)/2+((a[m-1]-a[0])/2+(a[m-1]-a[0])%2);
//cout<<((a[m-1]-a[0])/2+(a[m-1]-a[0])%2)<<endl;
//cout<<(a[m-1]-a[0])/2+(a[m-1]-a[0])%2<<endl;
printf("%d\n",max(big,small));
}
return 0;
}