CCPC-Wannafly 自闭day4

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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/cgold/p/12207621.html