原题:https://fjnuacm.top/d/junior/p/491?tid=633184a5ea0e1b063194593d 杰尼龟刚刚接触了信息学竞赛,有一天它遇到了这样一个题:靶形数独。 “简单!”杰尼龟心想,同时很快就写出了一份程序,可是测试时却出现了错误。 题意 完成一个每格具有分数的数独,使分数和最大。 铺垫 先来看看这题 数独 - 洛谷. 显然,我们只需要用 \(dfs\) 就可以了。 我们传递两个参数,代表当前我们搜索的点。 然后我们判断一下列有没有超出最大值,有的话跳到下一行即可。 不过需要注意的是,我们没有必要嵌套两个 \(for\) (你喜欢的话记得 \(break\) ),只需在传递参数的时候把当前列 \(+1\) 即可。 思路 首先,我们很容易想到直接套数独的模板,然后记录一下最高分即可。 这没有错,但你会喜提 \(2tle\)。 为什么呢?你可以试试用你的思维来解数独。 当拿到一个数独的时候,你的第一反应是什么? 没错,自然是从空格最少的行填起。 这里就存在一个剪枝:对行排序。 我们可以用桶排序 ...
原题:https://fjnuacm.top/d/junior/p/464?tid=62e26edd3a711450d9b817c5 题意 小渊很懒,给你各个位置的高度,让你画立体图。 思路 首先,根据题单名称,我们可以知道要模拟。 方块之间的前后视觉遮挡问题 首先,我们来考虑这个本题最难的点。 显然,对于斜二测画法的立体图,后面靠左的区域会被前者覆盖。那么我们自然会发现,从前往后画,覆盖问题会变得很复杂(不过也不是不能做)。 所以,我们不妨试试从俯视视角的左上角开始画。 我们以一个方块为一个单位开始画图。这里我们定义一个 \(char\) 二维数组来存储一个方块,并用题给的 \(.\) 符号来表示空区域。 char[][] one = { "..+---+".toCharArray(), "./ /|".toCharArray(), "+---+ |".toCharArray(), "| | +".toCharArray(), "| |/.". ...
Practice. A. Divide and Conquer 题意 给定一个数组 \(a\),定义操作为选定一个元素并将其除 \(2\) 后向下取整,输出最少操作数,使整个数组的和为奇数。 思路 考虑到数据量比较小,我们不妨直接用“分治”的方法,考虑每个元素需要多少次才能改变奇偶性,然后找出操作数最少的元素,对应的操作数就是我们想要的答案。 当然,本来就是奇数的话就直接输出 \(0\)。 时间复杂度:\(O(n)\) 对应AC代码 #include <bits/stdc++.h> using namespace std; #define int long long const int N = 60, inf = 0x3f3f3f3f; int a[N]; signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t, n; cin >> t; while(t --){ memset(a, 0 ...
Practice. A. Joey Takes Money 题意 给定一个包含 \(n\) 个 \(\geq 1\) 的元素的数组 \(a\),定义操作为: 选定 \(i, j, i \neq j\); 选两个 \(\geq 1\) 的正整数 \(x, y\),满足 \(x \cdot y = a_i \cdot a_j\); 将 \(a_i, a_j\) 改为 \(x, y\)。 输出任意次操作后数组的和的最大值 x2022。 思路 显然,对于 \(a_i, a_j\),\(1 + a_i \cdot a_j\) 一定是所有操作中最大的和,那么我们可以依次从左到右将所有数都执行一遍该操作,得到 \(1, 1, 1, \ldots, \prod a_i\),求和即可。 时间复杂度:\(O(n)\) 对应AC代码 import java.util.*; public class Main{ public static void main(String[] args){ Scanner sca ...
Practice A. Absolute Maximization 题意 给定一个数组 \(a\),定义操作为选择两个元素 \(a_i, a_j\),并交换它们二进制下的第 \(b\) 位。输出任意次操作后的 \(\max(a) - \min(a)\) 的最大值。 思路 既然可以无限次交换,那么我们只要找出最高位,从最高位开始往下找,只要有一个元素该位存在 \(1\),那么我们就拿过来构建新的数字,这样即可得到最大值。反之同理。 时间复杂度:\(O(n)\) 对应AC代码 import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); for(int w=0;w<t;w++){ int n = scanner ...
Practice. A. A+B? 题意 给定一个形如 \(a+b\) 的字符串,输出答案。\(a, b \in [0, 9]\)。 思路 模拟。 时间复杂度:\(O(1)\) import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); while(t -- > 0){ String[] a = scanner.next().split("\\+"); System.out.println(Integer.parseInt(a[0]) + Integer.parseInt(a[1])); } } } 过于签到,应该有语言可以一行解 ...
Contestant. Rank 3808. Rating +17. A. Exponential Equation 题意 给定整数 \(n\),输出一对 \(x, y\),满足 \(x ^ y \cdot y + y ^ x \cdot x = n\)。 思路 不妨令 \(x = 1\),那么 \(y = n / 2\)。 显然,当 \(n\) 为奇数的时候,一定是无解的,因为 \(x ^ y \cdot y\) 和 \(y ^ x \cdot x\) 的奇偶性一定是一致的。 所以,\(n\) 为偶数的时候,输出 \(1, n / 2\)。 时间复杂度:\(O(1)\) 对应AC代码 import java.math.BigInteger; import java.util.*; public class Main{ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); i ...
Contestant. Rank 3392. Rating -15. 代码略去了快读模板 A. Codeforces Checking 题意 给定一个字符,判断是否在 \(codeforces\) 字符串中出现。 思路 数组记录 + 读数组。 时间复杂度:\(O(1)\) 对应AC代码 import java.io.*; import java.math.*; import java.util.*; import java.util.concurrent.atomic.*; public class Main{ public static void main(String[] args) throws Exception{ Console console = new Console(); int t = console.nextInt(); boolean[] have = new boolean[26]; for(char each : "codeforces" ...
Contestant. Rank 530. Rating +127. 代码略去了快读模板 A1. Non-alternating Deck (easy version) 题意 给定 \(n\) 个颜色相同的卡片,取卡片顺序为 \(A,B,B,A,A,B,B,A,A,B,B,...\),每次取卡片的数量依次递增,当无法继续取的时候,按照正常顺序,下一个取卡片的人取完所有卡片。输出 \(A,B\) 各取了多少卡片。 思路 暴力模拟。 时间复杂度:\(O(\sqrt n)?\) 对应AC代码 import java.io.*; import java.math.*; import java.util.*; import java.util.concurrent.atomic.*; public class Main{ public static void main(String[] args) throws Exception{ Console console = new Console(); ...