P13013 [GESP202506 五级] 奖品兑换

输入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的限制)                  │
└─────────────────────────────────────────────────────────────┘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值