【新初二必做】并查集阶段性检测 全盘题解

注:本帖节选自本蒟蒻《2022暑初二信息竞赛学习成果分享》一帖中,Link

Afternoon——并查集复习测试

考试“游记”

拿到题目,看了一眼第一题,心态都崩了。 (My heart is broken!)

15:00开考。

我先选择做第二题,一看就是个并查集的板题,3 + 5 / 2先下一城。15 min, 15:15

接着解决第三题,也是并查集的基础题目,so easy! 可是当我看到第三个输出时—— (wq,神魔bt题!),花了25分钟先解决一、二小问。 25 min, 15:40

第四题乍看有点难度,但其实很简单,但我调了很久代码!太浪费时间了。 45 min, 16:25

我继续思考第三题,想到了一种神奇的方法,过了样例,信心十足!… 15 min, 16:40

解决第一题,我从三个样例中似乎找到了规律(样例真人性化),很快打出来,但似乎不是那么简单,我也懒得再调了! 10 min, 16:50

最后十分钟,我似乎不再抱有任何希望了,顺其自然

17:00 收卷。

测评开始… 结果如下。

选手 A B C D 总分
C2024XSC249 AC 100 AC 100 AC 100 WA 90 390/400
题目总结
T72. 葡萄酒

题目描述
乔普是个很聪明的孩子,听说有一批葡萄酒被混入一瓶毒酒,由于价格便宜,打算将这一批酒购来,找出那瓶毒酒,再以高价出售,由于每瓶葡萄酒的包装和味道完 全相同,一时无法鉴定出哪瓶是毒酒,也不可能一一去试尝,他想到他的朋友伊娃,她养了一大群小白鼠,想用小白鼠去做实验,由于酒太多了,所以没有那么多去 尝试每一瓶酒。这种毒酒的毒性比较弱,小白鼠一旦品尝后,毒性会在24小时后发作。所以乔普想请你帮他设计一个方案的,这么多瓶酒,至少需要多少只小白鼠,一次性,喝其中的某些酒,要在第二天后找出哪一瓶毒酒。

输入格式
一个整数 N N N,表示有 N N N瓶酒。

输出格式
一个整数,至少需要多少只小白鼠,在第二天将毒酒找出。

样例
样例输入 1

2

样例输出 1

1

样例输入 2

6

样例输出 2

3

样例解释 2

以下是其中的一个方案:

有6瓶酒,至少三只小白鼠

第一只小白喝其中的2 3 6号瓶酒

第二只小白喝其中的5 6号瓶酒

第三只小白喝其中的1 3 5号瓶酒

第二天

如果只有第三只挂了,说明是第1号瓶是毒酒;

如果只有第一只挂了,说明是第2号瓶是毒酒;

如果有一只和第三只挂了,说明是第3号瓶是毒酒;

如果一只都没有挂,说明是第4号瓶是毒酒;

如果第二和第三只挂了,说明是第5号瓶是毒酒;

如果是第一和第二只挂了,说明是第6号瓶是毒酒;

注意:方案很多种,找出一种即可

样例输入 3

10

样例输出 3

4

数据范围与提示
30 % 30\% 30% 的测试点输入数据保证 1 ≤ n ≤ 1000 1 \le n \le 1000 1n1000

60 % 60\% 60% 的测试点输入数据保证 1 ≤ n ≤ 1000000 1 \le n \le 1000000 1n1000000

80 % 80\% 80% 的测试点输入数据保证 1 ≤ n ≤ 2147483647 1 \le n \le 2147483647 1n2147483647

100 % 100\% 100% 的测试点输入数据保证 1 ≤ n ≤ 2 63 − 1 1 \le n \le 2^{63} -1 1n2631

理解与感悟

只要想到二进制上就已经做对了一半了。

分别用一个小白鼠尝每一列的酒,由于二进制具有唯一性,可以用小白鼠的组合来判断每一瓶酒是毒酒的**情况,因此, a n s = log ⁡ ( n ) ans=\log (n) ans=log(n)向上取整。

代码

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;

int main () {
   
	freopen ("wine.in", "r", stdin);
	freopen ("wine.out", "w", stdout);
	long long n;
	int cnt = 0;
	scanf ("%lld", &n);
	while (n != 1) {
   //用"除2"操作模拟log
		n = (n % 2 == 0 ? n / 2 : n / 2 + 1);
		cnt ++;
	} 
	printf ("%d", cnt);
	return 0;
}
T73. 雾山五行

题目描述
文件输入输出

鲁迅:人类就是打不赢妖怪。(雾中迷路)

即五叔、六叔大战雾山妖人后失利,被火行悬哥救下之后,就明白了要加强对村庄的防卫。

村庄里一共有 n n n个士兵,每个人都有自己单独的战斗力 c c c,后来五叔下令要组成队伍防御村庄,便有 m m m条组队请求,每条请求都表示[ A A A和他组里的所有人(如果没有就是 A A A自己)]和[ B B B和他组里的所有人(如果没有就是 B B B自己)]在一个队伍里。反正用并查集维护就对了

一个队伍的战斗力是战队里所有人战斗力之和,五叔想知道根据这些信息划分好战队以后,战斗力最强的战队的战斗力是多少。

(所以还是只能白给)

输入格式
第一行:两个整数 n , m ( 1 ≤ n , m ≤ 5000 ) n,m(1 \le n,m \le 5000) n,m(1n,m5000),分别表示有 n n n 个人, m m m 条组队请求。

第二行: n n n 个整数, c 1 , c 2 , . . . c n ( 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值