Slalom

题意:

给出每个门起点,高度和横向长度以及滑板的垂直速度,水平速度恒定,求出能取的最快滑板速度.

思路:

二分确定最快速度,由于门的高低递增,所以检查速度是否可行时从后往前,看通过下个门的高度临界值时是否可以通过门.

代码:

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int w, v, n;
struct door {
	double x, y;
}d[1000005];
int sn, s[1000005];
bool judge(int mid) {
	double sv = s[mid];
	double l = d[n-1].x;
	double r = d[n-1].x+w;
	for(int i=n-2; i>=0; i--) {
		double q = v*((d[i+1].y-d[i].y)/sv);
		l -= q, r += q;//左右分别能达到的极值
		if(l < d[i].x) l = d[i].x;//与目的地的门比较
		if(r > d[i].x+w) r = d[i].x+w;
		if(r<l) return false;
	}
	return true;
}
int main() {
	int kase;
	scanf("%d", &kase);
	while(kase--) {
		scanf("%d%d%d", &w, &v, &n);
		for(int i=0; i<n; i++) scanf("%lf%lf", &d[i].x, &d[i].y);
		scanf("%d", &sn);
		for(int i=0; i<sn; i++) scanf("%d", &s[i]);
		sort(s,s+sn);
		int l = -1, r = sn;
		bool flag;
		while(l<r-1) {
			int mid = (l+r+1)/2;
			flag = judge(mid);
			if(flag) l = mid;
			else  r=mid;
		}
		if(l == -1) printf("IMPOSSIBLE\n");
		else printf("%d\n", s[l]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值