【桶】SSL 1191 选数

大意

在两组数中各取一个数,若和可能为10000输出Yes,否则为No

思路

这道题最麻烦的是它存在负数,我们可以开一个桶,然后让桶中所有元素统统加上一个正整数,该数一定要大于数据的最大范围,当然若数据最大范围过大,可以采用 m a p h a s h 求解,本文用的是 m a p 和桶

代码

#include<cstdio>
#include<map>
using namespace std;int a,n,m;
map<int,bool>ma;
signed main()
{
    scanf("%d",&n);
    for(register int i=1;i<=n;i++) scanf("%d",&a),ma[a]=true;//标记这个数存在
    scanf("%d",&m);
    for(register int i=1;i<=m;i++) {scanf("%d",&a);if(ma[10000-a]==true) return printf("YES")&0;}//计算是否有数能跟它匹配
    printf("NO");//否则输出NO
}

代码2

#include<cstdio>
#include<map>
using namespace std;int a,n,m;
bool ma[100001];
signed main()
{
    scanf("%d",&n);
    for(register int i=1;i<=n;i++) scanf("%d",&a),ma[a+50000]=true;
    scanf("%d",&m);
    for(register int i=1;i<=m;i++) {scanf("%d",&a);if(ma[60000-a]==true) return printf("YES")&0;}//因为之前是50000,所以这里要加上去变成用60000去减
    printf("NO");
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81667321