题目大意

 
    求出最后掉下去的人,和掉下去的时间。

题目分析

 
    可以按照初始位置对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;
}

 

相关文章: