1 条题解
-
0
🧠 题解(Solution)
✅ 本质分析
本题考察的是:集合相等判定 + 不同集合数量计数。
我们可以将每个人听到的树编号集合视作一个“二进制状态”或“布尔数组”,如果两个人的集合完全一致,他们的观点就一样。
✅ 解题思路
创建 个集合,记录每个人听到的树;
使用 set<set> 或 set<bitset> 存储所有人的观点;
插入所有人的观点集合;
最后统计该集合中的元素个数,即为不同观点的数量。
🧮 示例解析
输入中的人-树关系如下:
人 听到树 和树 ;
人 听到树 和树 ;
人 听到树 和树 ;
可知人 和人 的集合一致,而人 的集合不同。
故答案是 。
📌 算法复杂度
假设 ,;
对每个人维护一个大小为 的布尔数组,总复杂度约为 ;
利用集合去重,最终统计不同的观点数,效率较高。
代码实现
#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
- 上传者