P8800 [蓝桥杯 2022 国 B] 卡牌

本文介绍了如何利用二分查找算法解决最多卡牌套数的问题,通过检查每种卡牌组合是否满足条件,确保在给定空白牌数量范围内凑齐最多的套数。代码展示了如何读取输入并执行此操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P8800 [蓝桥杯 2022 国 B] 卡牌

分析

“最多” -- 二分

1.二分区间(凑齐的卡牌套数):

l:a[]min;r:(a[]+b[])max

2.check(x):

(1)for循环内:

判断x - a[i] <= b[i](对于 i 种牌,假设把空白牌用完,是否能凑齐x套)

        Y:定义一个变量,加上x - a[i](对于第 i 种牌,凑齐x套需要的空白牌数)

        N:return false;

(2)判断需要的空白牌是否超出题目给的范围(if(s <= m))

        s <= m:

                        s == m:ans = mid

                        s < m:l = mid + 1

        s > m:

                        r = mid - 1

代码 

注意:一定一定一定记得开long long.....

scanf("%lld")!!!

#include<iostream>
using namespace std;

typedef long long ll;
const int N = 200010;
int a[N],b[N],n;
ll m;

bool check(int x)
{
	ll s = 0;
	for(int i = 0;i < n;i ++)
	{
		if(x - a[i] <= b[i])
		{
			if(x - a[i] > 0) 
			s += (x - a[i]);
		}
		else return false;
	}
	if(s <= m) return true;
	else return false;
}

int main()
{
	int l = 0x3f3f3f3f,r = 0;
	scanf("%d %lld",&n,&m);
	for(int i = 0;i < n;i ++)
	{
		scanf("%d",&a[i]);
		l = min(l,a[i]);
	}
	for(int i = 0;i < n;i ++)
	{
		scanf("%d",&b[i]);
		r = max(r,a[i] + b[i]);
	}
	int ans = 0;
	while(l <= r)
	{
		int mid = l + r >> 1;
		if(check(mid))
		{
			ans = mid;
			l = mid + 1;
		}
		else r = mid - 1;
	}
	printf("%d",ans);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值