【PAT甲级】1048 Find Coins (25 分) C++ 全部AC

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/sinat_42483341/article/details/100587173

题目

给你一个sum,以及拥有的钱
让你找出一个组合,正好用两张钱付清sum,注意如果有多个结果,输出其中最小的

这道题注意稍微优化一下算法,要不然卡在测试点3,4

我是用二重循环过了的,只要注意输入的时候去重一下数据,然后在计算的时候进行合理的剪枝,并不会超时。

在这里插入图片描述


题解 C++

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> coin;
int coins[1000] = { 0 };//用于去重
int cmp(int a1, int a2) {//小到大
	return a1 < a2;
}
int main() {
	int totalCoin;
	int sum;
	cin >> totalCoin >> sum;

	//拥有的硬币
	for (int i = 0; i < totalCoin; i++) {
		int t;
		cin >> t;
		if (coins[t] > 2) {//数据去重,否则3、4测试点超时
			continue;
		}
		else {
			coin.push_back(t);
			coins[t]++;
		}
	}

	//排序
	sort(coin.begin(), coin.end(), cmp);

	//求和
	for (int i = 0; i < totalCoin; i++) {
		for (int j = i + 1; j < totalCoin; j++) {
			if (coin[i] + coin[j] == sum) {
				cout << coin[i] << " " << coin[j];
				return 0;
			}
			else if (coin[i] + coin[j] > sum) {
				break;
			}
		}
		if (coin[i] * 2 > sum) {
			break;
		}
	}

	cout << "No Solution";
	system("pause");
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/100587173