1. 程式人生 > >【51NOD1557兩個集合】 SET

【51NOD1557兩個集合】 SET

題目連結 https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1557 題意 給你n個不同的數和兩個空的集合和兩個數A,B,如果你把x丟進a集合,那麼一定也要把A-x丟進a集合,,如果你把x丟進b集合,那麼一定也要把B-x丟進b集合,也就是說對於某個數如果A-x和B-x都不存在,那麼遊戲就結束了,如果某個元素x在a集合而A-x在B集合,同樣輸出NO 做法 將每個數放入set,我們對每個數判斷是否合法的時候要先看他是不是隻能放入某個集合,如果他只能放入a集合或者b集合,那麼肯定是合法的,如果都不能,那麼肯定是不合法的,如果都能的話,我們要特判一下A=B的情況,A=B就當作一個集合算,如果A!=B而且都能的話,那麼我們就要看A-(B-x)或者B-(A-x)是否存在,因為如果A-(B-x)存在,那麼對於與x相加等於B的元素,也可以將他放入a中,如果B-(A-x)存在,那麼對於與x相加等於A的元素,也可以將他放入A中,兩者只要有一個存在即可,於是這道題就做完了,可以這樣考慮的原因是每個數只出現一次,所以不存在兩個數與x相加都等於A或B,所以對每個元素單獨判是否合法是可行的。 程式碼

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
const int maxn = 2e5+10;
set<int> ans;
int x[maxn];
int main()
{
    int n,a,b;
    scanf("%d%d%d",&n,&a,&b);
    for(int i=1;i<=n;i++)
    {
        scanf
("%d",&x[i]); ans.insert(x[i]); } int flag; for(int i=1;i<=n;i++) { flag=0; if(ans.count(a-x[i])) { flag=1; } if(a!=b&&ans.count(b-x[i])) { if(flag==1) { if(!ans.
count(a-b+x[i])&&!ans.count(b-a+x[i])) flag=0; } else { flag=1; } } if(flag==0) break; } if(flag==0) printf("NO"); else printf("YES"); return 0; }