题目大意
求出最后掉下去的人,和掉下去的时间。
题目分析
可以按照初始位置对N个人进行排序,找出从A到A方向的端点之间和A方向相反的人的个数count,可以画图得知,从A开始,沿着A的方向的第count个人,就是最后和A碰撞之后的人碰撞的那个人,输出即可。
实现(c++)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<cmath>
#include<iostream>
using namespace std;
#define MAX_N 32005
#define max(a, b) a >b?a:b
double gStartPos[MAX_N];
int gPre[MAX_N];
struct Person{
int dir;
double start_pos;
char name[255];
};
Person gPerson[MAX_N];
bool Cmp(const Person& p1, const Person& p2){
return p1.start_pos < p2.start_pos;
}
int main(){
int n;
double l, v;
while (cin >> n && n){
cin >> l >> v;
char dir;
double max_t = 0;
int max_id;
for (int i = 0; i < n; i++){
cin >> dir >> gPerson[i].start_pos >> gPerson[i].name;
gPerson[i].dir = ((dir == 'p' || dir == 'P')? 0 : 1);
}
sort(gPerson, gPerson + n, Cmp);
for (int i = 0; i < n; i ++){
if (gPerson[i].dir == 1){
if (max_t < gPerson[i].start_pos / v){
max_t = gPerson[i].start_pos / v;
max_id = i;
}
}
else{
if (max_t < (l - gPerson[i].start_pos) / v){
max_t = (l - gPerson[i].start_pos) / v;
max_id = i;
}
}
}
int count = 0;
int id = 0;
if (gPerson[max_id].dir == 0){
for (int i = max_id + 1; i < n; i++){
if (gPerson[i].dir == 1){
count++;
}
}
id = max_id + count;
}
else{
for (int i = 0; i < max_id; i++){
if (gPerson[i].dir == 0){
count++;
}
}
id = max_id - count;
}
//!!!! 截断小数,取后两位,而不是四舍五入!
printf("%13.2lf %s\n", int(max_t*100)/100.0, gPerson[id].name);
}
return 0;
}