I - Fast Race Gym - 102566I题解

题目链接
题目大意:给出n辆车在一条直线上赛跑,给出起始位置和速度,求最后的排名和最后一次排名变动的时间。
题目分析:最后的排名很容易求得,以速度为第一关键字,位置为第二关键字进行排序即可求得。对于最后一次排名变动的时间,有如下结论:对排序后的元素从前到后两两比较更新答案即可。
证明I - Fast Race Gym - 102566I题解_第1张图片
代码

#include 
using namespace std;
const int MAX_N = 1e5 + 5;
struct node {
     
	int id, p, s;
} a[MAX_N];
int T, n;
double ans;
bool cmp(node a, node b) {
     
	return a.s > b.s || a.s == b.s && a.p > b.p;
}
int main() {
     
	cin >> T;
	while (T--) {
     
		ans = 0;
		scanf("%d", &n);
		for (int i = 1; i <= n; i++) {
     
			int p, s;
			scanf("%d %d", &p, &s);
			a[i] = {
     i, p, s};
		}
		sort(a + 1, a + n + 1, cmp);
		for (int i = 1; i <= n; i++) printf("%d ", a[i]);
		printf("\n");
		for (int i = 1; i < n; i++)
			if (a[i].s != a[i + 1].s) 
				ans = max(ans, double(a[i + 1].p - a[i].p) / (a[i].s - a[i + 1].s));
		cout << setprecision(6) << fixed << ans << endl;
	}
}

你可能感兴趣的:(集训队暑假训练)