注:本帖节选自本蒟蒻《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 1≤n≤1000;
60 % 60\% 60% 的测试点输入数据保证 1 ≤ n ≤ 1000000 1 \le n \le 1000000 1≤n≤1000000;
80 % 80\% 80% 的测试点输入数据保证 1 ≤ n ≤ 2147483647 1 \le n \le 2147483647 1≤n≤2147483647;
100 % 100\% 100% 的测试点输入数据保证 1 ≤ n ≤ 2 63 − 1 1 \le n \le 2^{63} -1 1≤n≤263−1;
理解与感悟
只要想到二进制上就已经做对了一半了。
分别用一个小白鼠尝每一列的酒,由于二进制具有唯一性,可以用小白鼠的组合来判断每一瓶酒是毒酒的**情况,因此, 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(1≤n,m≤5000),分别表示有 n n n 个人, m m m 条组队请求。
第二行: n n n 个整数, c 1 , c 2 , . . . c n ( 1