版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目
给你一个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");
}