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

題目

給你一個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");
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章