1048 Find Coins (25分)

#include<iostream>
#include<cstring>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>

using namespace std;
const int N = 1e5+5;

int n, m, tmp;
int Sum[N];

int main() {
	for(int i=0; i<=N; i++) {
		Sum[i] = 0;
	}

	cin >> n >> m;

	for(int i=0; i<n; i++) {
		cin >> tmp;

		Sum[i] = tmp;
	}
	sort(Sum, Sum+n);
	bool flag = false;
	for(int i=0; i<n; i++) {
		int j = upper_bound(Sum+i+1, Sum+n, m-Sum[i]-1)-Sum;
		if(j <n && Sum[j]+Sum[i] == m) {
			cout << Sum[i] << " "<< Sum[j] << endl;
			return 0;
		}
	}
		cout << "No Solution" << endl;
	return 0;
}

 

在Python中,我们可以使用二查找算法的思想来处理找零问题,特别是在找零硬币的场景中。所谓的“三法”实际上是一种优化过的二查找,这里假设我们有一个列表表示可用的面额,例如[1, 3, 5, 10],而我们需要找到最小的组合来凑出某个金额。以下是基本步骤: 1. **初始化**: - 定义一个函数`find_smallest_coins`,它接受目标金额`target`和硬币面额列表`coins`作为参数。 - 初始化两个指针`low`和`high`,别指向列表的第一个元素和最后一个元素。 2. **递归过程**: - 检查`low`是否小于等于`high`。 - 如果是,计算中间位置`mid`。 - 如果`coins[mid]`正好等于`target`,返回`[coins[mid]]`。 - 如果`coins[mid]`大于`target`,说明最小面额应该在前半部,将`high`设为`mid - 1`。 - 否则,如果`coins[mid]`小于`target`,说明最小面额应该在后半部,将`low`设为`mid + 1`。 3. **递归结束条件**: - 当`low`大于 `high`时,意味着找不到合适的组合,返回空列表`[]`,或者可以返回一个默认提示如"无法凑出目标金额"。 4. **返回结果**: - 函数返回找到的最小面额组合列表。 下面是一个简单的示例代码实现: ```python def find_smallest_coins(target, coins): if not coins or target < coins[0]: return [] low, high = 0, len(coins) - 1 while low <= high: mid = (low + high) // 2 if coins[mid] == target: return [coins[mid]] elif coins[mid] > target: high = mid - 1 else: low = mid + 1 # 当无法找到合适组合时返回默认信息 return "无法凑出目标金额" # 示例 coins = [1, 3, 5, 10] print(find_smallest_coins(11, coins)) # 输出: [1, 1, 1, 1, 1] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值