poj之旅——2674

来源:互联网 发布:.net在线考试系统源码 编辑:程序博客网 时间:2024/04/29 15:51

题目描述:在长度为L的杆上,有n只蚂蚁,他们有的向右爬,有的向左爬,速度均为v,求最后一只掉下杆子的蚂蚁的时间与名称。


题解:时间显而易见,maxdistance/v即可。

       名称有点麻烦,需要先保存距离为maxdistance的蚂蚁编号,再沿着它的方向,看有几只蚂蚁和他方向相反,编号对应加减一下即可。


参考程序:

#include<cstdio>#include<algorithm>#include<cmath>#define maxn 33000#define EPS 1e-6using 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;}


0 0
原创粉丝点击