题面

相信英文题面也很好理解

x

\tt x

x 个红糖,

y

\tt y

y 个蓝糖。每一个礼包里面要么有

a

\tt a

a 个红糖+

b

\tt b

b 个蓝糖,要么是

a

\tt a

a 个蓝糖+

b

\tt b

b 个红糖。

问最多能打多少份礼包。

T

1

0

4

\tt T\leq 10^4

T≤104 组数据,

1

x

,

y

,

a

,

b

1

0

9

\tt1\leq x,y,a,b\leq10^9

1≤x,y,a,b≤109 。

题解

Solution #1

不难发现答案具有包含性,能打

n

\tt n

n 份就一定能打

n

1

\tt n-1

n−1 份。

交换,令

a

b

\tt a\geq b

a≥b,那么每打包一份礼包,

x

\tt x

x 和

y

\tt y

y 都至少会减少

b

\tt b

b。

直接二分答案

s

\tt s

s,那么在

x

,

y

s

b

\tt x,y\geq s\cdot b

x,y≥s⋅b 的前提下,再把

x

\tt x

x 和

y

\tt y

y 都减去

s

b

\tt s\cdot b

s⋅b 后,相当于在

x

,

y

\tt x,y

x,y 中只用找单独的

s

\tt s

s 个

a

b

\tt a-b

a−b 就行了(

{

x

,

y

}

\tt\{x,y\}

{x,y} 变成了

{

x

s

b

,

y

s

b

}

\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=b

a=b 或者

x

a

b

+

y

a

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 。

直到这里,都没怎么用脑子。

7

m

i

n

\tt7~min

7 min 过掉,总复杂度

O

(

T

log

)

\tt O(T\log)

O(Tlog),速度还行,

31

m

s

\tt31~ms

31 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 b

x≥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=b

a=b 的情况,再继续讨论。

为了尽量地利用糖果,使之剩下的最少(每个礼包固定消耗

a

+

b

\tt a+b

a+b,因此剩下最少一定意味着礼包最多),那么就要尽量使最终的

x

y

\tt|x-y|

∣x−y∣ 最小化。由于每一份礼包 1 都能减少差值

a

b

\tt a-b

a−b ,那么我们就令礼包

(

a

,

b

)

\tt(a,b)

(a,b) 的个数为

x

y

a

b

\tt\left\lfloor\frac{x-y}{a-b}\right\rfloor

⌊a−bx−y​⌋ ,然后再利用剩下的求出礼包 2 的个数、贡献。

为了调整出正确答案,我们还得求一求礼包 1 个数为

x

y

a

b

+

1

\tt\left\lfloor\frac{x-y}{a-b}\right\rfloor+1

⌊a−bx−y​⌋+1 的情况,再取更优值。毕竟有些边角情况,原先的下取整是考虑不到的。

时间复杂度

O

(

T

)

\tt O(T)

O(T) ,写得一般的还是

31

m

s

\tt31~ms

31 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. hihoCoder #1234 : Fractal(数学简单题)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 This is the logo of PKUACM 2016. More specifically, the logo i ...

  2. PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记

    PJ考试可能会用到的数学思维题选讲 by Pleiades_Antares 是学弟学妹的讲义--然后一部分题目是我弄的一部分来源于洛谷用户@ 普及组的一些数学思维题,所以可能有点菜咯别怪我 OI中的数 ...

  3. acm.njupt 1001-1026 简单题

    点击可展开上面目录 Acm.njupt 1001-1026简单题 第一页许多是简单题,每题拿出来说说,没有必要,也说不了什么. 直接贴上AC的代码.初学者一题题做,看看别人的AC代码,寻找自己的问题. ...

  4. 天哪!毫无思绪!令人感到恐惧的数学(水题?)(TOWQs)

    这道题的题目描述灰常简单,第一眼看以为是一道十分水的题目: 但是!!!(我仔细一看也没有发现这背后隐藏着可怕的真相~) 下面给出题目描述: 给出一个整数x,你可以对x进行两种操作.1.将x变成4x+3 ...

  5. BZOJ 2683: 简单题

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 913  Solved: 379[Submit][Status][Discuss] ...

  6. 【BZOJ-1176&2683】Mokia&简单题 CDQ分治

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  7. Bzoj4066 简单题

    Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 2185  Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...

  8. Bzoj2683 简单题

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

  9. 这样leetcode简单题都更完了

    这样leetcode简单题都更完了,作为水题王的我开始要更新leetcode中等题和难题了,有些挖了很久的坑也将在在这个阶段一一揭晓,接下来的算法性更强,我就要开始分专题更新题目,而不是再以我的A题顺 ...

随机推荐

  1. 代码调用Rally的接口介绍

    1. 支持的语言 2. 创建APIKey 3. GetRequest 4. QueryRequest 5. CreateRequest 6. 参考资料 本文链接: https://www.cnblog ...

  2. 入坑KeePass(四)KeePass通过坚果云WebDav同步方法

    参考博客:什么值得买平台-Keepass+坚果云:多平台密码无缝同步 .1.在坚果云上创建一个同步专用的文件夹(建议勾上"默认不同步到电脑"选项) 创建之后可以把刚才创建的数据库文 ...

  3. 爱快在PVE下不定时反复重启死机的解决方法

    太长不看版本: 爱快3.6.X在PVE乃至于ESXI下都存在一定的兼容问题! 官网下载3.6.X安装后进入系统设置-升级备份-版本升级,使用爱快3.4.9bin升降级包,下载其中的bin升降级包,将爱 ...

  4. Linux常用操作:文件及文件夹

    一.创建 (1)mkdir 创建一个目录 (2)touch 创建一个空文件 注:-r 表示递归操作 二.删除 rm 删除文件 rm -r 删除目录 rm -r * 删除目录下的所有文件 注:-f 不用 ...

  5. 第1期 考研中有关函数的一些基本性质《zobol考研微积分学习笔记》

    在入门考研微积分中,我们先复习一部分中学学的初等数学的内容.函数是非常有用的数学工具. 1.函数的性质理解: 首先考研数学中的所有函数都是初等函数.而函数的三个关键就是定义域.值域.对应关系f. 其中 ...

  6. CentOS中实现基于Docker部署BI数据分析

    作为一个专业小白,咱啥都不懂. linux不懂,docker不懂. 但是我还想要完成领导下达的任务:在linux中安装docker后部署数据可视化工具.作为一名敬业 的打工人摆烂不可以,躺平不可以,弱 ...

  7. bat-静默安装并配置mysql(windows版)

    mysql版本 mysql-5.6.35-winx64 路径关系 @echo off Setlocal enabledelayedexpansion @REM vscode中自动开启延迟环境变量扩展, ...

  8. python是什么?工作前景如何?怎么算有基础?爬数据违法嘛......

    随着python越来越火爆并在2021年10月,语言流行指数的编译器Tiobe将Python加冕为最受欢迎的编程语言,且置于Java.C和JavaScript之上,于是越来越多的人开始了解python ...

  9. 使用C#编程语言开发Windows Service服务

    转载-https://www.cnblogs.com/yubao/p/8443455.html Create Windows Service project using Visual Studio C ...

  10. Min_25 筛与杜教筛

    杜教筛 \(\) 是 \(\) 的前缀和,\(\), \(\) 同理. 假设 \( × = ℎ\) ,并且 \(, \) 易求出,\(\) 难求出. 那么 \[H () = \sum_{ \cdot ...