当前位置: 首页 > news >正文

[GESP202506 五级] 奖品兑换

视频讲解:[GESP202506 五级] 奖品兑换-信息学奥赛GESP等级考试真题解析

一、原题

题目背景

为了保证只有时间复杂度正确的代码能够通过本题,时限下降为 400 毫秒。

题目描述

班主任给上课专心听讲、认真完成作业的同学们分别发放了若干张课堂优秀券和作业优秀券。同学们可以使用这两种券找班主任兑换奖品。具体来说,可以使用 a 张课堂优秀券和 b 张作业优秀券兑换一份奖品,或者使用 b 张课堂优秀券和 a 张作业优秀券兑换一份奖品。

现在小 A 有 n 张课堂优秀券和 m 张作业优秀券,他最多能兑换多少份奖品呢?

输入格式

第一行,两个正整数 n,m,分别表示小 A 持有的课堂优秀券和作业优秀券的数量。

第二行,两个正整数 a,b,表示兑换一份奖品所需的两种券的数量。

输出格式

输出共一行,一个整数,表示最多能兑换的奖品份数。

输入输出样例

输入 #1

8 8
2 1

输出 #1

5

输入 #2

314159 2653589
27 1828

输出 #2

1599

说明/提示

对于 60% 的测试点,保证 1 ≤ a,b ≤ 100,1 ≤ n,m ≤ 500。

对于所有测试点,保证 1 ≤ a,b ≤ 10^{4},1 ≤ n,m ≤ 10^{9}

二、做题思路

1)尝试暴力模拟(考场只能60分)

#include<bits/stdc++.h>
using namespace std;
int main() {//确定课堂券n,作业券mint n,m;cin>>n>>m;//确定兑换条件a,bint a,b;cin>>a>>b;//保证a>b if(a<b) swap(a,b);	//模拟贪心过程 int ans=0;while(true){//保证n>m,大的兑换大的 if(n<m) swap(n,m);n-=a;m-=b;//兑换不了,退出 if(n<0||m<=0) break;//兑换次数+1 ans++;}cout<<ans;
}

2)官方二分答案实现

2.1)保证 大对大,小对小

#include<bits/stdc++.h>
using namespace std;
int n, m, a, b;
int main() {cin >> n >> m >> a >> b;if (a > b) swap(a, b);if (n > m) swap(n, m);
}

2.2)计算二分范围

int left = min(n / a, m / b);
int right = (n + m) / (a + b);

2.3)二分模板

int mid = 0, ans;
while (left <= right) {mid = (left + right) / 2;if (  is(mid) ) {left = mid + 1;ans = mid;} else {right = mid - 1;}
}
cout << ans;

2.4)判断答案标准

bool is(int x) {//计算余额 int bank = n - x * a;int bro = m - x * b;//计算续弥补的损失 int diffp = b - a;int money = ceil(-bro * 1.0 / diffp) * diffp;//无法弥补,直接退出 if ( bank < 0) return false;if ( bro < 0  &&  bank < money ) return false;//能弥补返回true return true;}

2.2)保证 大对大,小对小

三、答案

#include<bits/stdc++.h>
using namespace std;
int n, m, a, b;
bool is(int x) {//计算余额 int bank = n - x * a;int bro = m - x * b;//计算续弥补的损失 int diffp = b - a;int money = ceil(-bro * 1.0 / diffp) * diffp;//无法弥补,直接退出 if ( bank < 0) return false;if ( bro < 0  &&  bank < money ) return false;//能弥补返回true return true;}
int main() {cin >> n >> m >> a >> b;if (a > b) swap(a, b);if (n > m) swap(n, m);int left = min(n / a, m / b);int right = (n + m) / (a + b);int mid = 0, ans;while (left <= right) {mid = (left + right) / 2;//cout<<mid<<" "<<left<<" "<<right<<endl;		if (  is(mid) ) {left = mid + 1;ans = mid;} else {right = mid - 1;}}cout << ans;	
}

http://www.dtcms.com/a/537032.html

相关文章:

  • Strassen矩阵乘法算法
  • 网站开发新闻怎么写相应式手机网站建设
  • [C++][windows]C++类成员函数默认参数和成员变量初始化问题
  • Vue 动态路由复制标签页失效?彻底解决新标签页路由空白问题
  • 扁平化网站特效张家港网站建设培训班
  • 【GaussDB】深入剖析Insert Select慢的定位全过程
  • 面向智能体与大语言模型的 AI 基础设施:选项、工具与优化
  • 招商网站建设服务商湖南专业网站建设服务
  • 从0到1:易趋驱动产品研发项目全流程管理效能跃升
  • 巴彦淖尔市百家姓网站建设文昌市规划建设管理局网站
  • JAX 高性能机器学习的新选择 - 从NumPy到变换编译
  • 能盈利的网站网站首页description标签
  • Geoserver修行记-安装CSS插件避坑
  • O(1) 时间获取最小值的巧妙设计——力扣155.最小栈
  • 韩国网站建设wordpress安装博客步骤
  • dbpystream webapi: 一次clickhouse数据从系统盘迁至数据盘的尝试
  • 大数据-136 - ClickHouse 集群 表引擎详解 选型实战:TinyLog/Log/StripeLog/Memory/Merge
  • 高效的项目构建和优化之前端构建工具
  • 网站建设公司宣传文案如何通过cpa网站做推广
  • windows环境,设置git 默认提交信息
  • 电商平台网站建设合同宁波seo优化报价多少
  • 哪里找人做网站系统设计
  • 做一个网站需要多少钱大概费用商贸有限公司注销流程
  • OpenVLA-OFT+ 在真实世界 ALOHA 机器人任务中的应用
  • 网站调用字体四网合一网站建设
  • 网站优化包括整站优化吗公司管理体系
  • Spring—Springboot篇
  • 《拆解一封网络信:HTTP 报文详解》
  • wordpress仿站网桌子seo关键词
  • 如何判断服务器是否遭受攻击?