CodeUp Problem D: More is better
根据题目意思,输入的每一对A、B都是直接朋友,并且最后只会得到一个集合,该集合就是Mr Wang选择的男孩。
因此很容易写出代码,甚至不需要自己构建一个并查集,只需要使用C++的set模板,每次读入一对A、B,就把A、B插入集合,最后集合的大小就是Mr Wang选择的男孩个数。
但是只得了50分,仔细分析一下,可能是“只有一个集合”这一个假定错误,应该在输入数据中包含多个集合的假定下写代码。
转变思路为:
- 仍然用数组实现一个并查集。
- 另外开一个数组counts,counts[i]表示节点i为根节点时对应集合的大小。
- 维护一个计数器maxcnt,用来存当前大小最大的集合数量,每次进行集合合并时都尝试更新maxcnt。
- 合并完所有元素后也能得到最大集合的大小。
#include <cstdio>
#include <algorithm> using namespace std;
const int maxn = 10000010;
int maxcnt, cnts[maxn];
int father[maxn]; int FindFather(int father[], int b)
{
int x = b;
while (x != father[x])
{
x = father[x];
} int a = b;
while (a != father[a])
{
int z = father[a];
father[a] = x;
a = z;
}
return x;
}
void Union(int father[], int b1, int b2)
{
int fa1 = FindFather(father, b1);
int fa2 = FindFather(father, b2); if (fa1 != fa2)//这个判断一定一定不能少,如果不先判断fa1是否等于fa2,会导致同一个集合大小翻倍,导致出错
{
father[fa1] = fa2;
cnts[fa2] += cnts[fa1];
} maxcnt = max(maxcnt, cnts[fa2]);
return;
}
void Init(int father[], int n)
{
for (size_t i = 1; i <= n; i++)
{
father[i] = i;
cnts[i] = 1;
}
maxcnt = 1;
}
int main(int argc, char** argv) {
int linen, a, b;
while (scanf("%d", &linen) != EOF)
{
Init(father, maxn);
while (linen--)
{
scanf("%d%d", &a, &b);
Union(father, a, b);
} printf("%d\n", maxcnt);
} return 0;
}
CodeUp Problem D: More is better的更多相关文章
- Codeup 25609 Problem I 习题5-10 分数序列求和
题目描述 有如下分数序列 2/1,3/2,5/3,8/5,13/8,21/13 - 求出次数列的前20项之和. 请将结果的数据类型定义为double类型. 输入 无 输出 小数点后保留6位小数,末尾输 ...
- Codeup 25594 Problem H 例题5-8 Fibonacci数列
题目描述 输入一个正整数n,求Fibonacci数列的第n个数.Fibonacci数列的特点:第1,2个数为1,1.从第3个数开始,概述是前面两个数之和.即: 1,1,2,3,5,8,13,21 - ...
- Codeup 25593 Problem G 例题5-7 求圆周率pi的近似值
题目描述 用如下公式 4*Π = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15 - 求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不 ...
- 1199 Problem B: 大小关系
求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...
- No-args constructor for class X does not exist. Register an InstanceCreator with Gson for this type to fix this problem.
Gson解析JSON字符串时出现了下面的错误: No-args constructor for class X does not exist. Register an InstanceCreator ...
- C - NP-Hard Problem(二分图判定-染色法)
C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144 ...
- Time Consume Problem
I joined the NodeJS online Course three weeks ago, but now I'm late about 2 weeks. I pay the codesch ...
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- hdu1032 Train Problem II (卡特兰数)
题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能. (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...
随机推荐
- Hibernate处理MySQL的时间
如果Java使用使用 java.util.Date 作为持久化对象属性,在 Mysql 中使用 YEAR.DATE.TIME.TIMESTAMP.DATETIME 五种类型 则需要添加@Tempora ...
- 帆软报表(finereport)图表操作细节
图表间之间的组件间隔:body-->属性-->布局-->组件间隔 决策报表背景水印:body-->属性-->水印 仪表盘指针/枢纽/背景颜色:样式-->系列 柱形图 ...
- PHP爱考的那些笔试题
PHP爱考的那些笔试题 来自<PHP程序员面试笔试宝典>,涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书. 一.单例模式是在应用程序中最多只能拥有 ...
- Solution -「多校联训」最大面积
\(\mathcal{Description}\) Link. 平面上有 \(n\) 个点 \(A_{1..n}\),\(q\) 次询问,每次给出点 \(P\),求 \[\max_{1\le ...
- Solution -「ARC 110D」Binomial Coefficient is Fun
\(\mathcal{Description}\) Link. 给定非负整数序列 \(\{a_n\}\),设 \(\{b_n\}\) 是一个非负整数序列且 \(\sum_{i=1}^nb_i\ ...
- 乘风破浪,遇见未来元宇宙(Metaverse)之进入元宇宙世界,虚拟数字人行业洞察报告
正值元宇宙热潮,虚拟数字人兴起 作为⼀个新兴领域,虚拟数字⼈已经引起市场和资本的⾼度关注,截⾄目前据不完全统计,全球范围已有500+虚拟数字人相关项目获得融资,融资总额超10亿美元,并且融资项目和总额 ...
- 60天shell脚本计划-10/12-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年3月13日 --修改时间:2021年3月17日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...
- node热加载
node可以通过require热加载文件,这里先提一下require的加载方式: 当我们第一次使用require加载模块时require会把被加载文件的绝对路径作为key存放在require的cach ...
- qt(一)
一.Qt安装 qt离线安装地址:http://download.qt.io/archive/qt/ 参考教程:https://blog.csdn.net/u013934107/article/deta ...
- Python 并发编程(下)
Python 并发编程(下) 课程目标:掌握多进程开发的相关知识点并初步认识协程. 今日概要: 多进程开发 进程之间数据共享 进程锁 进程池 协程 1. 多进程开发 进程是计算机中资源分配的最小单元: ...