USACO 19Open Bronze T1 - Bucket Brigade 题解
题意:给定一个 \(10\times 10\) 的矩阵,有一个 B、一个 L 和一个 R,其中 R 那格不能走。现在求 B 和 L 之间的最短路(不包括 B 和 L)。
这题是1权图的最短路,可以用 BFS 求。对于 R 那格特判即可。
1 |
|
题意:给定一个 \(10\times 10\) 的矩阵,有一个 B、一个 L 和一个 R,其中 R 那格不能走。现在求 B 和 L 之间的最短路(不包括 B 和 L)。
这题是1权图的最短路,可以用 BFS 求。对于 R 那格特判即可。
1 | #include<bits/stdc++.h> |
题意:给定 \(n\) 个单词,每行最多 \(k\) 个字符(不含空格),输出这些单词的排版。
按照题意模拟即可。
因为行末不能有空格,所以要特判一下 curline 的值。
1 | #include<bits/stdc++.h> |
题意:给定七个数,分别是 \(a, b, c, a+b, b+c, a+c, a+b+c\),求 \(a, b, c\)(已知 \(0 < a \leq b \leq c, a, b, c \in \mathbb{N}^*\))。
由于 \(a, b, c > 0\),故而 \(a+b+c\) 一定是这七个数的最大值,\(a\) 一定是这七个数的最小值,\(b\) 一定是这七个数的第二小值。知道了 \(a, b\) 之后,\(c\) 就可以算出来了。
1 | #include<bits/stdc++.h> |
题意:给定在各组的原先人数和现在人数,求每个级别的人有多少晋升的。
按照题意模拟即可。
1 | #include<bits/stdc++.h> |
题意:给定 \(k\),\(n\),\(w\),求至少需要多少钱才能买到 \(w\) 个香蕉,其中第 \(i\) 个香蕉需要 \(i \times k\) 钱。
注意不需要借钱的时候就不用借了,直接输出 \(0\) 即可。
1 | #include<bits/stdc++.h> |
题意:给定 \(n\) 个题目,三个人对每道题每人都给出是否确定能解决,求至少有两个人确定能解决的题目数。
显然只需判断每道题给定的三个 0/1 之和是否大于等于 \(2\) 即可。
1 | #include<bits/stdc++.h> |
题意:在一条直线上有四个点 \(A, B, X, Y\),其中 \(X, Y\) 两点可以通过传送门互相传送,求 \(A\) 到 \(B\) 的最短距离。
易得总共只有三种情况:\(A\) 直接到 \(B\),\(A\) 到 \(X\) 传送到 \(Y\) 再到 \(B\),\(A\) 到 \(Y\) 传送到 \(X\) 再到 \(B\)。直接计算即可。
1 | #include<bits/stdc++.h> |
题意:输入 \(n\) 个字符串 \(s_1, s_2, \cdots, s_n\),将他们倒序输出。
输入字符串,将他们压入栈中,然后依次输出即可。
1 | #include<bits/stdc++.h> |
题意:有 \(t\) 组数据,每次给定一个长 \(n\) 的数组,每组求其中奇数的个数。
根据题意,每次判断累加即可。
1 | #include<bits/stdc++.h> |
题意:求一个无向图中连通块的个数。
设 \(mark_i\) 表示点已经访问过。遍历 \(i=1\cdots n\),若 \(mark_i\) 的值为 false,则从 \(i\) 开始进行深度优先搜索,将所有与 \(i\) 相连的点标记为已访问,最后答案加 \(1\)。
1 | #include<bits/stdc++.h> |
题意:有 \(t\) 组数据,每组给定一个整数 \(n\)(\(1 \leq n \leq 9 \times 10^{18}\)),已知 \(n\) 可以表示为唯一的 \(n=p^2q\),且 \(p, q\) 是质数,求 \(p\) 和 \(q\) 的值。
设知 \(n=p^2q \sim 10^{18}\),设 \(q \sim 10^m\),则 \(p \sim 10^{\frac{18-m}{2}}\)。
则 \(p, q\) 的阶的最大值就是 \(\max(m, \frac{18-m}{2})\)。
若 \(m = \max(m, \frac{18-m}{2})\),则 \(2m \geq 18-m\),得 \(m\geq 6\),则 \(18-m \leq 12\),得 \(\frac{18-m}{2} \leq 6\),故而可以先找到 \(q\),所以只需要找到 \(10^6\) 的素数。
反之,则 \(2m \leq 18-m\),得 \(m \leq 6\),所以也只需要找到 \(10^6\) 的素数。但是,\(n\) 的最大值是 \(9\times 10^{18}\),所以可以筛到 \(10^7\)。
综上所述,只需要找到 \(10^6\) 的素数,然后枚举 \(p\) 或 \(q\) 是否符合条件即可。
筛到一个满足 \(p \equiv 0 \pmod n\) 的素数 \(p\) 时,若 \(p \equiv 0 \pmod{\frac{n}{p}}\),则这个素数 \(p\) 一定是 \(n=p^2q\) 中的素数 \(p\),否则这个素数一定是 \(q\)。
知,\(1 \sim x\) 的素数大概是 \(\dfrac{x}{\ln x}\) 个,设筛到的素数为 \(s\)(此处 \(s=10^7\)),则时间复杂度为 \(O(s+\frac{ts}{\ln s})\),其中 \(t\) 为数据组数。
1 | #include<bits/stdc++.h> |
题意:求无向图从点 \(1\) 开始的简单路径个数,并对 \(10^6\) 取 \(\min\)。
直接从 \(1\) 开始 DFS,若个数超过 \(10^6\),则输出 1000000 即可。
1 | #include<bits/stdc++.h> |