题目难度:两颗星
题目大意:有硬币序列,给定一个需要付款的钱,需要找出两个硬币可以付款,并且输出其中较小的一组(即所所有组合中,较小硬币面值最小的组合)
题目坑点:如果有三个相同面值的硬币,需要对flag数组标记自增,不能仅仅标记存在。寻找方案的时候,也应该判断为是否>=1(否则在中间一个测试点会报错)
代码如下:
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
bool cmp(int a,int b){
return a<b;
}
int main(){
int N,M;
cin>>N>>M;
int coins[N];
for(int i=0;i<N;i++){
cin>>coins[i];
}
sort(coins,coins+N,cmp);
int end=-1;//记录最大的值
int flag[1005];
memset(flag,0,sizeof(int)*1005);
for(int i=0;i<N;i++){
if(coins[i]<M){
end++;
flag[coins[i]]++;
}
else
break;
}
int has=0;
for(int i=0;i<end;i++){
int v1=coins[i];
flag[v1]--;
if(flag[M-v1]>=1){//一个坑点
has=1;
cout<<v1<<" "<<M-v1;
break;
}
}
if(has==0)
cout<<"No Solution";
}