two points
don't used hash table
#include <cstdio> #include <algorithm> using namespace std; const int INF=0x7fffffff; const int N=100003; int coin[N]; int n,needSum; void findCoins(){ int i=0,j=n-1; int lowMinCoin=INF,left=-1,right=-1; while(i<j){ if(coin[i]+coin[j]==needSum){ if(coin[i]<lowMinCoin){ left=coin[i]; right=coin[j]; lowMinCoin=coin[i]; } i++,j--; } else if(coin[i]+coin[j]>needSum) j--; else i++; } if(left==-1&&right==-1) printf("No Solution\n"); else printf("%d %d\n",left,right); } int main() { scanf("%d%d",&n,&needSum); for(int i=0;i<n;i++) scanf("%d",coin+i); sort(coin,coin+n); findCoins(); return 0; }
use hash table
#include <cstdio> #include <cstring> const int INF=501; const int N=503; int hash[N]; int n,needSum; void findCoins(){ int i=1,j=500; int lowMinCoin=INF,left=-1,right=-1; while(i<=j){ if(i==j){ if(hash[i]<2) break; } if(hash[i]>0){ if(hash[j]>0){ if(i+j==needSum){ if(i<lowMinCoin) left=i,right=j,lowMinCoin=i; i++,j--; } else if(i+j>needSum) j--; else i++; } else j--; } else i++; } if(left==-1&&right==-1) printf("No Solution\n"); else printf("%d %d\n",left,right); } int main() { memset(hash,0,sizeof(hash)); scanf("%d%d",&n,&needSum); for(int i=0;i<n;i++){ int temp; scanf("%d",&temp); hash[temp]++; } findCoins(); return 0; }