A:
需要稍微动一下脑子
基本思路:
ans表示答案个数;
如果一个数出现3次,那么这个人只有这一个账户。
如果出现2次,那么这个人可能有多个账户,但是一个人最多只能有一个2次的账户。
如果出现1次,那么这个人可能有多个账户。
所以2次加上3次的数量可以确定一部分人数,设为t,并设为ans初值。
但是有些人可能只有一次的账户。
对于每一行,如果2次账户加3次账户和加上一次账户和(即总数)小于t,则ans不变。
否则将多出一些人拥有一次账号,这些人数为这一行的总数 - t,更新ans。
#include<iostream> #include<cstdio> #include<algorithm> #include<set> using namespace std; typedef long long ll; const ll MAXN = 1e6 + 5; ll a[4][MAXN],cnt[MAXN],vis[MAXN],b[11],c[11]; ll n,k,m,ans; void solve(){ cin >> n >> k; for(int i = 1;i <= k;i ++){ scanf("%lld",&a[i][0]); for(int j = 1;j <= a[i][0];j ++) scanf("%lld",&a[i][j]),cnt[a[i][j]] ++; } for(int i = 1;i <= k;i ++){ for(int j = 1;j <= a[i][0];j ++){ if(cnt[a[i][j]] >= 2){ b[i] ++; if(!vis[a[i][j]]) vis[a[i][j]] = 1,ans ++; } else c[i] ++; } } for(int i = 1;i <= 3;i ++) if(c[i] && c[i] >= ans - b[i]) ans = c[i] + b[i]; // ans = ans + c[i] - ans + b[i] cout << ans << endl; return; } int main(){ solve(); return 0; }