当前位置: 代码迷 >> 综合 >> pta--1048 Find Coins(25 分)(二分或Hash)
  详细解决方案

pta--1048 Find Coins(25 分)(二分或Hash)

热度:50   发布时间:2023-12-26 10:06:44.0

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805432256675840

【分析】

题意:从N个数里找出两个数值加起来刚好等于M的数。如果有多组,只输出前面的数最小的那一组。否则,No Solution。

思路:二分查找。因为只输出一组,所以,只要找到一组就return掉就好。这样也保证了是最小的那组。

         也可以用哈希散列做,数组存储N个数里每个数出现的次数,然后i从1~M遍历,只要M-i的个数≥1即可输出。如果i=M-i,再讨论即可。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int val[maxn];
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=0;i<n;i++)scanf("%d",&val[i]);sort(val,val+n);for(int i=0;i<n;i++){int st=i+1,ed=n;while(st<ed){int mid=(st+ed)/2;if(val[mid]>m){ed=mid;continue;	}if(val[i]+val[mid]>m)ed=mid;//,cout<<"ok\n";else if(val[i]+val[mid]==m){printf("%d %d\n",val[i],val[mid]);return 0;}else st=mid+1;}if(val[i]>m)break;	}printf("No Solution\n");return 0;
}

 

  相关解决方案