题目描述:在长度为L的杆上,有n只蚂蚁,他们有的向右爬,有的向左爬,速度均为v,求最后一只掉下杆子的蚂蚁的时间与名称。
题解:时间显而易见,maxdistance/v即可。
名称有点麻烦,需要先保存距离为maxdistance的蚂蚁编号,再沿着它的方向,看有几只蚂蚁和他方向相反,编号对应加减一下即可。
参考程序:
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 33000
#define EPS 1e-6
using namespace std;
struct Ant{
double pos;
char name[256];
bool operator < (const Ant& rhs)const {
return fabs(pos)<fabs(rhs.pos);
}
}a[maxn];
int main(){
int n;
while (scanf("%d",&n)==1 && n){
double L;
int v;
scanf("%lf%d",&L,&v);
for (int i=0;i<n;i++){
char dire;
scanf("\n%c %lf %s",&dire,&a[i].pos,&a[i].name);
a[i].pos*=(dire=='n' || dire=='N')?-1:1;
}
sort(a,a+n);
double maxd=0.0;
int id=0;
bool dir=true;
for (int i=0;i<n;i++){
double d=(a[i].pos<0.0?0:L)-a[i].pos;
if (d>maxd+EPS){
maxd=d;
id=i;
dir=a[i].pos>0.0;
}
}
int cnt=0;
if (dir){
for (int i=id;i<n;i++)
if (a[i].pos<0.0)
cnt++;
id+=cnt;
}else{
for (int i=id;i>=0;i--)
if (a[i].pos>0)
cnt++;
id-=cnt;
}
double res=maxd/v;
printf("%13.2f %s\n",floor(res*100)/100.0,a[id].name);
}
return 0;
}