正经题解
2025-09-06 14:27:42
发布于:广东
6阅读
0回复
0点赞
虽然官方在数据上偷了亿点懒,乱写都能过,但我们还是要写正解的
二分+check,二分来确定最多能兑换的奖品份数,check(int x)用来检查是否可以用份奖品的兑换券数量满足条件。
#include<bits/stdc++.h>
using namespace std;
int m,n,a,b;
bool check(int x)
{
long long p=x*a;
long long q=x*b;
int y;
if(p>m)//课堂优秀券不够,需要从作业优秀券中借一些券来补课堂优秀券
{
y=(p-m)/(a-b)+((p-m)%(a-b)>0);//需要从作业优秀券中借多少券
p-=y*(a-b);
q+=y*(a-b);
}
return (p<=m&&q<=n);
}
int main()
{
cin>>m>>n>>a>>b;
if(m<n)swap(m,n);//确保 m 是较大的券数量
if(a<b)swap(a,b);//确保 a 是较大的兑换券数量,简化后续的逻辑处理
int l=0;
int r=m/a+1;
while(r-1>l)
{
int mid=(r+l)/2;
if(check(mid))
{
l=mid;
}
else
{
r=mid;
}
}
cout<<l;
return 0;
}
唯一一次认真写
全部评论 1
2天前 来自 广东
0
有帮助,赞一个