BZOJ-3190-赛车-JLOI2013-暴力枚举

描述

  • 这里有一辆赛车比赛正在进行,赛场上一共有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;
}

      
      
     
     
    
    
   
   


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值