卡片游戏

描述

小Hi的面前摆放了N张卡片,每张卡片都有A和B两面。其中第i张卡片的A面写着一个整数Ai,B面写着一个整数Bi。  

一开始所有卡片都是A面向上。现在小Hi必须选择一张卡片,将其翻成B面向上。  

设N张卡片向上那一面的数字组成的集合是S,那么游戏的得分是:最小的不属于S的正整数。  

例如S={1, 2, 4, 6, 7},则得分是3。  

你能算出小Hi最多能得多少分么?

输入

第一行包含一个整数N。

第二行包含N个整数Ai。  

第三行包含N个整数Bi。  

对于50%的数据,1 ≤ N ≤ 1000  

对于100%的数据,1 ≤ N ≤ 100000 1 ≤ Ai, Bi ≤ 1000000

输出

输出最大得分

样例输入
5  
1 2 3 5 6  
3 4 3 4 4
样例输出

6

#include <bits/stdc++.h>
using namespace std;
map<int, int> mp;
set<int> S;
const int maxn = 1e5 + 10;
int A[maxn], B[maxn];

int main(){
    int N, ans = 1;
    scanf("%d", &N);
    for(int i = 1; i <= N; ++i) scanf("%d", A + i), mp[A[i]]++;
    for(int i = 1; i <= N; ++i) scanf("%d", B + i);
    for(int i = 1; i <= N + 1; ++i) if(mp.find(i) == mp.end()) S.insert(i);//如果键和值不等,就放入S
    for(int i = 1; i <= N; ++i){//遍历寻找最大值
        mp[A[i]]--;
        if(mp[A[i]] == 0) S.insert(A[i]);
        mp[B[i]]++;
        if(mp[B[i]] == 1 && S.find(B[i]) != S.end()) S.erase(B[i]);
        ans = max(ans, *S.begin());
        mp[B[i]]--;
        if(mp[B[i]] == 0) S.insert(B[i]);
        mp[A[i]]++;
        if(mp[A[i]] == 1 && S.find(A[i]) != S.end()) S.erase(A[i]);
    }
    printf("%d\n", ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_38970751/article/details/80040133