1 条题解

  • 0
    @ 2025-4-8 10:02:32

    🧠 题解(Solution)

    ✅ 本质分析

    本题考察的是:集合相等判定 + 不同集合数量计数。

    我们可以将每个人听到的树编号集合视作一个“二进制状态”或“布尔数组”,如果两个人的集合完全一致,他们的观点就一样。

    ✅ 解题思路

    创建 PP 个集合,记录每个人听到的树;

    使用 set<set> 或 set<bitset> 存储所有人的观点;

    插入所有人的观点集合;

    最后统计该集合中的元素个数,即为不同观点的数量。

    🧮 示例解析

    输入中的人-树关系如下:

    11 听到树 22 和树 33

    22 听到树 22 和树 44

    33 听到树 22 和树 33

    可知人 11 和人 33 的集合一致,而人 22 的集合不同。

    故答案是 22

    📌 算法复杂度

    假设 P<100P < 100T<100T < 100

    对每个人维护一个大小为 TT 的布尔数组,总复杂度约为 O(PT)O(P \cdot T)

    利用集合去重,最终统计不同的观点数,效率较高。

    代码实现

    #include<stdio.h>
    #include<set>
    #include<string.h>
    using namespace std;
    
    set <int> a[110] ;
    bool flag [110] ;
    int t, p ;
    //set <int> :: iterator it  ;迭代器
    
    int main () {
    	//freopen ("a.txt" , "r" , stdin ) ;
    	memset (flag, 0, sizeof(flag) ) ;
    	scanf ("%d%d", &t, &p ) ;
    	int i, j ;
    	int cnt = 0 ;
    	while (~ scanf ("%d%d", &i, &j) ) {
    		a[i].insert (j) ;
    	}
    	for (int i = 1 ; i < p ; i++) {
    		if (flag[i] == 0) {
    			flag[i] = 1 ;
    			for (int j = i + 1 ; j <= p ; j++) {
    				if (a[i] == a[j]) {
    					flag [j] = 1 ;
    				}
    			}
    			cnt ++ ;
    		}
    	}
    	printf ("%d\n", cnt ) ;
    	return 0 ;
    }
    
    • 1

    信息

    ID
    1420
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者