【2020, XIII Samara Regional Intercollegiate Programming Contest】B. Bonuses on a Line

B. Bonuses on a Line

题意:数轴上有 (n) 个点,坐标为 ((x_i,0)) ,你从原点开始能够移动 (t) 个单位距离,询问最多能够经过几个点。
分析:将正点和负点分开存,然后枚举我们到达的左端点(右端点同理),二分搜索从该端点向右走最多能够经过几个正点。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	ll n, t;
	cin >> n >> t;
	vector<ll> pos, neg;
	for (int i = 0; i < n; ++i) {
		ll x;
		cin >> x;
		if (x < 0) neg.emplace_back(-x);
		else pos.emplace_back(x);
	}
	sort(neg.begin(), neg.end());
	sort(pos.begin(), pos.end());
	ll ans = 0;
	for (int i = 0; i < neg.size(); ++i) {
		if (neg[i] > t) break;
		ll maxd = t - neg[i] - neg[i];
		ll res = 0;
		if (maxd > 0) res = upper_bound(pos.begin(), pos.end(), maxd) - pos.begin();
		ans = max(ans, i + res + 1);
	}
	for (int i = 0; i < pos.size(); ++i) {
		if (pos[i] > t) break;
		ll maxd = t - pos[i] - pos[i];
		ll res = 0;
		if (maxd > 0) res = upper_bound(neg.begin(), neg.end(), maxd) - neg.begin();
		ans = max(ans, i + res + 1);
	}
	cout << ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值