
输入1:
8 8
2 1
输出1:
5
输入2:
314159 2653589
27 1828
输出2:
1599

#include<bits/stdc++.h>
using namespace std;
int n,m,a,b;
bool check(int mid){
int suma=mid*a,sumb=mid*b;
if(n<mid*a){
int cha=a-b;
int cnt=ceil((suma-n+0.0)/cha);
sumb=mid*b+cnt*cha;
}
return sumb<=m;
}
int main(){
cin>>n>>m>>a>>b;
if(a<b) swap(a,b);
if(n<m) swap(n,m);
int l=0,r=n/b,mid;
while(l<r){
mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
return 0;
}
流程图:
┌─────────────────────────────────────────────────────────────┐
│ 程序开始 │
└───────────────────┬─────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 声明全局变量:int n, m, a, b │
└───────────────────┬─────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 进入main函数 │
└───────────────────┬─────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 输入:cin >> n >> m >> a >> b │
└───────────────────┬─────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 处理a和b:if (a < b) swap(a, b) (确保a ≥ b) │
└───────────────────┬─────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 处理n和m:if (n < m) swap(n, m) (确保n ≥ m) │
└───────────────────┬─────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 初始化二分边界:l = 0, r = n / b (r为理论最大可能值) │
└───────────────────┬─────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 二分循环:while (l < r) │
├───────────────┬─────────────────────────────────────────────┤
│ │ │
│ ┌────────────▼────────────┐ ┌─────────────────────────┐ │
│ │ 计算mid = (l + r + 1) >> 1 │ │ │ │
│ └────────────┬────────────┘ │ │ │
│ │ │ │ │
│ ┌────────────▼────────────┐ │ │ │
│ │ 调用check(mid) │ │ │ │
│ └────────────┬────────────┘ │ │ │
│ │ │ │ │
│ ┌────────────▼────────────┐ │ │ │
│ │ check返回true? │ │ │ │
│ ├────────────┬────────────┤ │ │ │
│ │ 是 │ 否 │ │ │ │
│ ├────────────▼────────────┤ ├─────────────────────────▼─┤ │
│ │ l = mid │ │ r = mid - 1 │ │
│ └────────────┬────────────┘ └─────────────────────────┬─┘ │
│ └───────────────┬─────────────────────────┘ │
│ │ │
└───────────────────────────────┼───────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 输出l:cout << l │
└───────────────────┬─────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 程序结束 │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ check函数(参数:int mid) │
├─────────────────────────────────────────────────────────────┤
│ 1. 计算:suma = mid * a, sumb = mid * b │
│ 2. 判断:if (n < mid * a) (n不足以满足suma) │
│ ├─ 是: │
│ │ - 计算cha = a - b │
│ │ - 计算cnt = ceil((suma - n) / cha) (需补充的差额次数)│
│ │ - 更新sumb = mid * b + cnt * cha │
│ └─ 否:sumb保持不变 │
│ 3. 返回:sumb <= m (判断是否满足m的限制) │
└─────────────────────────────────────────────────────────────┘

401

被折叠的 条评论
为什么被折叠?



