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

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/82379076