描述
- 这里有一辆赛车比赛正在进行,赛场上一共有N辆车,分别称为个g1,g2……gn。赛道是一条无限长的直线。最初,gi位于距离起跑线前进ki的位置。比赛开始后,车辆gi将会以vi单位每秒的恒定速度行驶。在这个比赛过程中,如果一辆赛车曾经处于领跑位置的话(即没有其他的赛车跑在他的前面),这辆赛车最后就可以得奖,而且比赛过程中不用担心相撞的问题。现在给出所有赛车的起始位置和速度,你的任务就是算出那些赛车将会得奖。
分析
- 暴力枚举每辆车是否可以得奖.
- 计算该车可以领跑的时间区间 [L, R], 初始化 L = 0, R = INF. 每次和另一辆车进行比较, 维护这个区间, 直到所有的车已经比较过或者 L > R.
- 暴力时间复杂度 O(n^2), 但数据没有卡.
#include
#include
#include
using namespace std;
const double INF = 1e18;
const int maxn = 10000 + 10;
int p[maxn], v[maxn];
vector
ans;
int main() {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &p[i]);
for(int i = 1; i <= n; i++) scanf("%d", &v[i]);
for(int i = 1; i <= n; i++) {
bool win = 1;
double L = 0, R = INF;
for(int j = 1; j <= n; j++) {
double x = 0.0, y = INF;
if(v[i] < v[j]) y = (double)(p[i]-p[j]) / (v[j]-v[i]);
else if(v[i] > v[j]) x = (double)(p[j]-p[i]) / (v[i]-v[j]);
else if(p[i] < p[j]) y = -INF;
L = max(L, x);
R = min(R, y);
if(L > R) { win = 0; break; }
}
if(win) ans.push_back(i);
}
int m = ans.size();
printf("%d\n", m);
for(int i = 0; i < m-1; i++) printf("%d ", ans[i]);
printf("%d\n", ans[m-1]);
return 0;
}