@班大大
由于题面上硬币值是整数,并且有界!所以我们可以将硬币值作为下标hash。,数组value[i]表示的是面值为i的硬币的个数!!输入完成后也就省去了排序过程。两头逼近查找即可
。!机智!!
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int value[501];
int main()
{
memset(value,0,sizeof(value));
int N,M;
cin>>N>>M;
int num;
int i=0;
while(i<N)
{
scanf("%d",&num);
value[num]++;//硬币值作为下标hash到数组,value【i】表示面值为i的硬币有几枚
i++;
}
int j=1,k=500;
while(j<k)
{
while(!value[j])j++;
while(!value[k])k--;//找到两头的非零硬币值
if(j+k>M)k--;
else if(j+k<M)j++;
else
{
cout<<j<<" "<<k<<endl;
return 0;
}
}
if(j==k&&j+k==M&&value[j]>1)//相同数值的两枚硬币组成m
{
cout<<j<<" "<<k<<endl;
return 0;
}
cout<<"No Solution"<<endl;
return 0;
}