Codeforces Round 961 (Div. 2) B2. Bouquet (Hard Version)

文章目录

B2. Bouquet (Hard Version)

写在前面

今天下午写这道题时,有思路却没写出来,后面看了一下别人写的代码豁然开朗,这道题其实挺简单的,没写出来只能说 我太菜了QAQ

思路

考点:排序+贪心

首先我们可以在序列中任意组合
那么这个序列的初始排序并不重要,我们可以先将序列进行升序排序

排完序后,对于这题而言,无非就两种情况:

  • 后一个数减当前的数大于1,那么只能选当前的数
  • 后一个数减当前的数等于1,那么2个数都要考虑

第一种情况没什么好说的,重点在于第二种情况:

如果两个数全部选完,并且不大于m,那就让这个值与ans比较大小即可
反之,我们可以运用贪心的策略我们先全部选小的数,如果还有剩余硬币,在选大的数

由于大的数跟小的数差值为1,我们可以将小的数替换成大的数,让它的硬币数+1

思路不难,接下来看代码~~

code

cpp 复制代码
PII a[N];
void solve(){
	int n,m;
	cin >> n >> m;
	for(int i=1;i<=n;++i) cin >> a[i].fi;
	for(int i=1;i<=n;++i) cin >> a[i].se;
	sort(a+1,a+1+n);
	int ans=0;
	a[n+1].fi=0,a[n+1].se=0;//相当于初始化
	for(int i=1;i<=n;++i){
		if(a[i+1].fi-a[i].fi==1){
			int temp=a[i].fi*a[i].se+a[i+1].fi*a[i+1].se;//全部选
			if(temp<=m) ans=max(ans,temp);
			else{
				int k=min(a[i].se,m/a[i].fi);//先选小的
				temp=k*a[i].fi;
				int t=min(a[i+1].se,(m-temp)/a[i+1].fi);
				temp+=t*a[i+1].fi;//还有剩余,再选大的
				if(k && t<a[i+1].se && temp<m){//判断是否可以进行替换
					int s=min(min(k,a[i+1].se-t),(m-temp));
					temp+=s;
				}
				ans=max(ans,temp);
			}
		}
		else{
			int k=min(a[i].se,m/a[i].fi);
		    int temp=k*a[i].fi;
		    ans=max(ans,temp);
		}
	}
	cout << ans << endl;
	return ;
}
相关推荐
宋明炜3 分钟前
VSCode + MSYS2 配置 C 语言开发环境(详细步骤)
c语言·ide·vscode
专注VB编程开发20年4 分钟前
C# int*指向 int 的指针类型(unsafe 上下文)
java·开发语言·c#
唯道行6 分钟前
计算机图形学·25 消隐2 区域子分算法-光线投射算法
人工智能·算法·计算机视觉·计算机图形学·opengl
测试人社区—小叶子7 分钟前
接口测试全攻略:从Swagger到MockServer
运维·c++·人工智能·测试工具·机器人·自动化·测试用例
zfxwasaboy8 分钟前
BUG: failure at drivers/pci/msi.c:376/free_msi_irqs()!
linux·c语言·bug
jinxinyuuuus9 分钟前
FIRE之旅 财务计算器:实时交互式建模与前端性能工程
前端·人工智能·算法·自动化
要站在顶端11 分钟前
iOS自动化测试全流程教程(基于WebDriverAgent+go-ios)
开发语言·ios·golang
liwulin050613 分钟前
【PYTHON】python venv创建虚拟环境,非conda
开发语言·python·conda
fengfuyao98513 分钟前
基于MATLAB的支持向量机在故障诊断中的应用例程
开发语言·支持向量机·matlab
千丈之松14 分钟前
能力和法律
算法