描述
小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; }