AT2580题解

本题可以很明显看出应该是二分题目,如果需要二分答案,需要满足:

  • 答案具有单调性,也就是说确定一个中央,中央左边不符合答案,右边符合,或者反过来。

假设二分答案验证阶段的复杂度是 O(m),总共的答案有 n 种选择,则二分答案的复杂度为 O(lognm)\large \text{O}(log_n \,\, m)

二分就是在单调性的可能答案 1 ~ n 中每次找到中间值并判断是否可行,值得找到最后一个答案。

代码:

#include <iostream>
#include <cmath>
using namespace std;

const int N = 1e5 + 5;
int n, a, b, arr[N];

bool check(long long x)
{
	int cnt = 0;
	for (int i = 1; i <= n; i++)
	{
		int b_hurt_times = ceil(arr[i] * 1.0 / b);
		if (b_hurt_times > x)
		{
			int s = x * b;
			cnt += (arr[i] - s - 1) / (a - b) + 1;
		}
		if (cnt > x) return false;
	}
	return true;
}

int main()
{
	ios::sync_with_stdio(false);
	cin >> n >> a >> b;
	for (int i = 1; i <= n; i++)
	{
		cin >> arr[i];
	}
	long long  l = 0, r = 1e13;
	while (l < r)
	{
		long long mid = (l + r) >> 1;
		if (check(mid))
		{
			r = mid;
		}
		else l = mid + 1;
	}
	cout << l << endl;
	return 0;
}
posted @   HappyBobb  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示