【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");
}

浙公网安备 33010602011771号