1048 Find Coins (25分)
题目大意:你有n(最多105)这么多的硬币,找出2个硬币满足m,有多个解决方案,输出其中一个硬币面值最小的组合,找不出则输出No Solution
输入样例1
8 15
1 2 8 7 2 4 11 15输出样例1
4 11
输入样例2
7 14
1 8 7 2 4 11 15输出样例2
No Solution
我使用的方法是用二叉搜索树存储数据加贪心,从i=1和m-i开始找,找到直接输出,直到i>m/2,找不到就输出No Solution.
代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct TreeNode *BST;
struct TreeNode{
int data;
BST Left,Right;
int visited;
};
void Clean(BST T){
T->visited++;
}
BST Insert(BST T,int x){
if(!T){
T=(BST)malloc(sizeof(struct TreeNode));
T->data=x;
T->visited++;
T->Left=T->Right= nullptr;
} else{
if(x<T->data)
T->Left=Insert(T->Left,x);
else if (x>T->data)
T->Right=Insert(T->Right,x);
else
T->visited++;
}
return T;
}
BST Finddata(BST T,int x){
if(T){
if(x==T->data){
if (T->visited>0){
T->visited--;
return T;
} else
return nullptr;
}
else if(x<T->data)
return Finddata(T->Left,x);
else if (x>T->data)
return Finddata(T->Right,x);
} else
return T;
}
int main()
{
int n,m;
cin>>n>>m;
int a[n+1];
int flag=0;
for (int i = 0; i < n; ++i) {
cin>>a[i];
}
sort(a,a+n);
int i,j=n/2;
BST T= nullptr;
for (i = 0; i <= n/2; ++i) {
if(i!=n/2)
T=Insert(T,a[j+i]);
if(i!=0)
T=Insert(T,a[j-i]);
}
BST temp;
for(i=1;i<=m/2;i++){
temp=Finddata(T,i);
if(temp){
if(Finddata(T,m-i)){
cout<<i<<' '<<m-i;
flag=1;
break;;
} else
Clean(temp);
}
}
if (!flag)
cout<<"No Solution";
return 0;
}