有没有大佬帮忙看一下我写的哪里有问题呀,自己测试的数据都是正确的,但就是过不了
查看原帖
有没有大佬帮忙看一下我写的哪里有问题呀,自己测试的数据都是正确的,但就是过不了
818552
loe2022楼主2023/4/21 20:53
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 30010;  //最多三万个学生嘛

int p[N];   //p[i] = j表示学生i在j组,p[i] = 0表示这个学生没在任何组里
int st[N];  //表示这个数之前有没有出现过,st[i] = 1出现过,else 没出现过
int cnt[N]; //cnt[i] 表示第 i 组数据里面的元素个数
//如果最后p[0] = 0,输出1, 否则输出cnt[p[0]]
int a[N];   //暂时每组的数字

int n, m;   //n 个学生,m 组数据

int main()
{
    //一次次扫,把该在一块的元素的p[i]的值搞成一样的
    while(cin >> n >> m && (n != 0 || m != 0))
    {
        memset(p, 0, sizeof p);     //一开始都没在任何一个组里
        memset(st, 0, sizeof st);   //一开始每一个数字都没有出现过
        memset(cnt, 0, sizeof cnt);
        for(int i = 1;i <= m;i ++ ) //每一组数据后面有 m 行
        {
            int k;
            scanf("%d",&k);   //每行的第一个数是这组中个数
            
            int flag = 0; //立个flag,这组数中的数在其他组中没有
            for(int j = 1;j <= k;j ++ )
            {
                scanf("%d",&a[j]);     
                if(st[a[j]] == 0){  //如果这个数之前没有出现过
                    st[a[j]] = 1;
                    p[a[j]] = i;
                    cnt[i] ++;
                } else {            
                    flag = p[a[j]];
                }
            }
            
            if(flag){
                 for(int j = 1;j <= k;j ++ )
                 {
                    if(p[a[j]] != flag) cnt[flag] ++;
                    p[a[j]] = flag;
                 }
            }
        }
        if(p[0] == 0) printf("%d\n",1);
        else printf("%d\n",cnt[p[0]]);
    }
    
    return 0;
}
2023/4/21 20:53
加载中...