【1048 25 hash】 Find Coins

传送门

题意

给定 \(n,m\),表示有 \(n\) 个不同的硬币,求是否有两个硬币 \(c_{1}+c_{2}=m(c_{1}\leq c_{2})\),如果有多个输出 \(c_{1}\) 小的一组

数据范围

\(n\leq 10^{5}\)
\(m\leq 10^{3}\)

题解

  • 累计所有数的个数
  • 枚举 \(m\) 的范围,为了找到两个数相加等于的情况,计算前现将映射减去,还有则成功

Code

#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int main(){
	int n,m; scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
		int x; scanf("%d",&x);
		mp[x]++;
	}
	int l,r;
	bool flag=0;
	for(int i=0;i<=m;i++){
		if(mp[i]){
			mp[i]--;
			if(mp[m-i]){
				l=i,r=m-i;
				flag=1;
				break;
			}
			mp[i]++;
		}
	}
	if(flag) printf("%d %d",l,r);
	else printf("No Solution");
}
posted @ 2021-02-23 16:00  Hyx'  阅读(59)  评论(0)    收藏  举报