题面

相信英文题面也很好理解

有 x\tt xx 个红糖,y\tt yy 个蓝糖。每一个礼包里面要么有 a\tt aa 个红糖+ b\tt bb 个蓝糖,要么是 a\tt aa 个蓝糖+ b\tt bb 个红糖。

问最多能打多少份礼包。

T≤104\tt T\leq 10^4T≤104 组数据,1≤x,y,a,b≤109\tt1\leq x,y,a,b\leq10^91≤x,y,a,b≤109 。

题解

Solution #1

不难发现答案具有包含性,能打 n\tt nn 份就一定能打 n−1\tt n-1n−1 份。

交换,令 a≥b\tt a\geq ba≥b,那么每打包一份礼包,x\tt xx 和 y\tt yy 都至少会减少 b\tt bb。

直接二分答案 s\tt ss,那么在 x,y≥s⋅b\tt x,y\geq s\cdot bx,y≥s⋅b 的前提下,再把 x\tt xx 和 y\tt yy 都减去 s⋅b\tt s\cdot bs⋅b 后,相当于在 x,y\tt x,yx,y 中只用找单独的 s\tt ss 个 a−b\tt a-ba−b 就行了({x,y}\tt\{x,y\}{x,y} 变成了 {x−sb,y−sb}\tt\{x-sb,y-sb\}{x−sb,y−sb},{a,b}\tt\{a,b\}{a,b} 变成了 {a−b,0}\tt\{a-b,0\}{a−b,0},其中一个为 0 了,两种糖果不再绑定),这等价于此时 a=b\tt a=ba=b 或者 ⌊xa−b⌋+⌊ya−b⌋≥s\tt\left\lfloor\frac{x}{a-b}\right\rfloor+\left\lfloor\frac{y}{a-b}\right\rfloor\geq s⌊a−bx​⌋+⌊a−by​⌋≥s 。

直到这里,都没怎么用脑子。7min\tt7~min7 min 过掉,总复杂度 O(Tlog⁡)\tt O(T\log)O(Tlog),速度还行,31ms\tt31~ms31 ms。

CODE

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 100005
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x) & (x))
LL read() {LL f = 1,x = 0;char s = getchar();while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}return f * x;
}
int n,m,i,j,s,o,k;
int X,Y,A,B;
bool check(int md) {int x=X,y=Y,a=A,b=B;if(x < md*1ll*B || y < md*1ll*B) return 0;x -= md*1ll*B; y -= md*1ll*B; a -= b;if(a == 0) return 1;return x/a + y/a >= md;
}
int main() {int T = read();while(T --) {X = read();Y = read();A = read();B = read();if(X < Y) swap(X,Y);if(A < B) swap(A,B);int as = 0;for(int i = 30;i >= 0;i --) {if(as+(1<<i) <= 1000000000 && check(as+(1<<i))) {as += (1<<i);}}printf("%d\n",as);}return 0;
}

Solution #2

不妨交换,令 x≥y,a≥b\tt x\geq y,a\geq bx≥y,a≥b 。

然后利用一定的贪心思路,不难发现,最优情况下 (a,b)\tt(a,b)(a,b) 的个数一定不小于 (b,a)\tt(b,a)(b,a)。换言之,我们可以认为有若干个权重为 1 的礼包 (a,b)\tt(a,b)(a,b),以及若干个权重为 2 的礼包 (a+b,b+a)\tt(a+b,b+a)(a+b,b+a).

先特判 a=b\tt a=ba=b 的情况,再继续讨论。

为了尽量地利用糖果,使之剩下的最少(每个礼包固定消耗 a+b\tt a+ba+b,因此剩下最少一定意味着礼包最多),那么就要尽量使最终的 ∣x−y∣\tt|x-y|∣x−y∣ 最小化。由于每一份礼包 1 都能减少差值 a−b\tt a-ba−b ,那么我们就令礼包 (a,b)\tt(a,b)(a,b) 的个数为 ⌊x−ya−b⌋\tt\left\lfloor\frac{x-y}{a-b}\right\rfloor⌊a−bx−y​⌋ ,然后再利用剩下的求出礼包 2 的个数、贡献。

为了调整出正确答案,我们还得求一求礼包 1 个数为 ⌊x−ya−b⌋+1\tt\left\lfloor\frac{x-y}{a-b}\right\rfloor+1⌊a−bx−y​⌋+1 的情况,再取更优值。毕竟有些边角情况,原先的下取整是考虑不到的。

时间复杂度 O(T)\tt O(T)O(T) ,写得一般的还是 31ms\tt31~ms31 ms,而且想的比较久。

CODE(by SharpnessⅤ)

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 500005
using namespace std;
int x,y,a,b;
void solve(){scanf("%d%d%d%d",&x,&y,&a,&b);if(x>y)swap(x,y);if(a>b)swap(a,b);if(x<a||y<b){puts("0");return ;}int res=y-x,lim=b-a;if(!lim){printf("%d\n",min(x,y)/a);return ;}int cur=min(res/lim,min(x/a,y/b));x-=cur*a,y-=cur*b;int ans=cur+min(x,y)/(a+b)*2;if(x>=a&&y>=b)x-=a,y-=b,cur++;printf("%d\n",max(ans,cur+min(x,y)/(a+b)*2));
}
int main(){int T;scanf("%d",&T);while(T--)solve();return 0;
}

[CF1538G] Gift Set (数学简单题)相关推荐

  1. 数学趣题——魔幻方阵

    数学趣题--魔幻方阵 转载链接:http://www.cnblogs.com/steven_oyj/archive/2010/05/26/1744130.html 问题: 在n*n的矩阵中填写1~n* ...

  2. 中考数学不准使用计算机,中考数学蒙题技巧

    马上就中考,很多同学面对中考还有一些迷茫.家长们不知道怎么做,面对孩子束手无措.今天,张老师带来一篇文章,如何分配中考时间,大家一定要收藏! 01 充分利用考前5分钟 很多学生或家长不知道,按照大型的 ...

  3. golang 模板 tpl 算术运算_高考数学常设的32个命题陷阱,七成同学中招失分!文末附数学疑难题(精品)模板!...

    数学考题都是有套路的. 命题老师喜欢把坑挖在哪里,陷阱喜欢设在哪里,提前知道了,就很容易避免丢分. 本文提到的高考数学命题者最爱设置的32个陷阱,也是大部分同学容易犯错丢分的知识点,请大家对照这些知识 ...

  4. 微电网日前优化调度入门:求解一道数学建模题

    最近看了一些微电网优化调度的论文,苦于无从下手之际,看到一道微电网日前优化调度相关的数学建模题:题目提供了一个简单的风光储微电网场景及测试数据,正好拿来练手.本文基于Python第三方库PuLP实现题 ...

  5. 自用力扣笔记备忘录——数组tag简单题

    想来想去还是决定写在csdn,本地的移动性不太好 此备忘录自用为住,方便本人复习用的 方法1为本人自己写的,其他的均有参考 目录若无方法一只有方法二,则是没写出来: 如果没有方法N小标题说明这个题官方 ...

  6. leetcode 最常见的150道前端面试题(简单题下)

    本文题目选自 LeetCode 精选 TOP 面试题[1],这些题在自己和同事亲身经历中,确实遇到的几率在百分之80%以上(成都和北京的前端岗位). 本篇是简单题(下)20题左右,上半部分详见leet ...

  7. 用Python解中考数学规律题

    用Python解中考数学规律题 以下为2018成都市的中考数学真题B卷第23题: 分析:   一.这是一道常规的找规律考题,一般每年的中考数学都会涉及,根据题的难易程度,位置一般会出现在B卷的第二题, ...

  8. 切比雪夫不等式例题讲解_2019高考数学大题押题(名师视频讲解,高考最后的提分机会)...

    关注公众号"人本教育高中数学"或者加微信:15010197848,快速获取:2019高考数学大题猜想课程 高考全国卷新课标数学命题规律 1.函数与导数:2-3个小题,1个大题,客观 ...

  9. 回忆当年高考的一道数学证明题

    恰逢高考季,昨夜又做梦,与高中相关,就索性来写一篇,题目自定,立意自选. 每年高考后,我都会拿湖北高考的数学试卷做一下,这也许是特殊的爱好吧.知识点和公式基本没有忘记,熟练度肯定不如当年. 今天来聊聊 ...

  10. 用计算机器提高正确率,如何提高数学计算题的正确率

    计算题是小学数学的一个重要的题型,对于计算题如何提高计算题的正确率,减少不必要的额错误呢?下面是小编整理的如何提高数学计算题的正确率,希望大家喜欢. 第一.要对计算引起足够的重视 很多同学总以为计算题 ...

最新文章

  1. 【青少年编程】【四级】用逗号分隔列表
  2. 全栈 - 20 Web 基础 网页的血肉 CSS
  3. pyspark rdd 数据持久化
  4. win10安装 MySQL安装教程
  5. javaee概览_Java 9概览
  6. bzoj1965 [AHOI2005]洗牌 结论
  7. python解释器的安装
  8. 关于《侏罗纪世界》你应该知道的18件事
  9. oracle性能优化总结1
  10. Knockout.Js官网学习(创建自定义绑定)
  11. BEA weblogic
  12. 阶乘的传统流程图 c语言,C语言算法与流程图.ppt
  13. Maven ,命令行中,字符编码 设置
  14. Mac 终端命令自动补齐的办法
  15. SwitchHosts-一款实用的host地址切换工具
  16. PS使用技巧(三) 吸管工具I
  17. 【SPSS】SPSS之相关系数矩阵(Pearson)
  18. Windows Server 2016 使用域管理员加域之后无法访问指定设备、路径或文件
  19. unity3d 700种 材质球_活动策划:这10种气球创意玩法,让活动现场的布置更高级。...
  20. 关于NX/UG使用KF二次开发的常用方法

热门文章

  1. mmo游戏服务器架构简述
  2. java web 图片 加载_Java web开发中加载图片路径的两种方式
  3. 《灵飞经》①洪武天下 第三章 东岛三尊
  4. 2022/7/14小记
  5. CodeForces - 898D Alarm Clock
  6. k8s Container资源控制: requests和limits
  7. 计算机毕业设计ssm文档资料管理系统
  8. mysql语句占位符_sql语句中的占位符?有什么作用
  9. Jquery插件实现“点击获取验证码后60秒内禁止重新获取(防刷新)”
  10. 武汉大学 gps 计算机 陈冰,武汉大学2015届优秀毕业研究生名单.doc