Practice. A. SSeeeeiinngg DDoouubbllee 题意 给定一个字符串,将字符串复制一遍后拼接在一起得到一个新的字符串,将该字符串重新组合,输出一种回文组合。 思路 倒着拼到末尾。 时间复杂度:\(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(); while(t -- > 0){ String s = scanner.next(); System.out.println(s + new StringBuilder(s).reverse()); } } } 过于无脑 ...
Practice. 代码略去了快读模板 A. Add Plus Minus Sign 题意 给定一个长度为 \(n\) 的二进制字符串,输出 \(n-1\) 个加减运算符,满足最后的结果的绝对值最小。 思路 无视第一位,配对 \(1,1\),对每一对输出 \(-,+\),剩余的 \(1\) 输出 \(-\),剩余的 \(0\) 输出任意符号。 时间复杂度:\(O(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(); int t = console.nextInt(); while(t -- > 0) ...
Practice. A. Extremely Round 题意 给定一个整数 \(n\),输出 \([1,n]\) 内只有一位非 \(0\) 的数的个数。 思路 显然,对于 \(t\) 位,有 \(9\) 个满足要求的数,我们只需考虑到何时停下枚举即可。 时间复杂度:\(O(\log_{10} n)\) 对应AC代码 #include <bits/stdc++.h> using namespace std; #define int long long signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t; cin >> t; while(t --){ int n; cin >> n; int a = n, tot = 0; while(a >= 10) a /= 10, tot ++; cout << tot * ...
Contestant(alt). Rank 6738. Rating -86 (+414 -500). A. Yet Another Promotion 题意 定义两天内提供购物服务,每天的货物价格分别为 \(a, b\),在第一天存在促销活动,购买 \(m\) 个货物后会赠送一个。输出购买 \(n\) 个货物的最少花费。 思路 对于 \(m+1\) 个所需货物,$m a $ 和 \((m + 1) \times b\) 分别为第一天和第二天的价格,那么我们只需分类讨论即可: 前者小,那么我们将能参与促销的货物全都在第一天购买,也就是总共有 \(\lfloor \frac{n}{m + 1} \rfloor \times m\) 个货物是参与了促销。此时,我们得到了 \(\lfloor \frac{n}{m + 1} \rfloor \times (m + 1)\) 个货物,那么剩余的货物就作为正常购买,我们用 \(\min(a,b)\) 购买即可; 后者小,直接全都在第二天买即可。 时间复杂度:\(O(1)\) 对应AC代码 #incl ...
Contestant. Rank 2650. Rating +7. A. One and Two 题意 给定一个包含 \(1\) 和 \(2\) 的数组,输出最小的 \(k\),满足 \(a_1 \cdot a_2 \cdot \ldots \cdot a_k = a_{k+1} \cdot a_{k+2} \cdot \ldots \cdot a_n\)。 思路 维护一个后缀和,统计前面和后面的 \(2\) 的个数,输出第一个 \(k\),满足 \(2\) 的个数一致。 时间复杂度:\(O(n)\) 对应AC代码 #include <bits/stdc++.h> using namespace std; #define int long long const int N = 1010; int a[N], suf[N]; signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t, n; cin >> t; whi ...
Practice. A. Cut the Triangle 题意 给定三个点,判断是否存在水平或数值的切割线,能将三个点所构成的三角形切割成两个三角形。 思路 很显然,我们只需判断是否存在直角三角形即可。 因为我们不知道哪个是直角,所以我们不妨找出所有 \(x\) 轴值相等的点和 \(y\) 轴相等的点。 更具体地说,我们统计一下满足上述条件的点,若为 \(1\) 个及以下,那么就可行,否则不可行。 时间复杂度:\(O(1)\) 对应AC代码 #include <bits/stdc++.h> using namespace std; #define int long long const int N = 110; signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t; cin >> t; while(t --){ int x1, y1, x2, y2, x3, y3; c ...
Rank 1. AC 4/9. 因为11.11为四根棍,所以注定只能写四题 A. 乘方 CSP 2022 T1 题意 比较 \(a ^ b\) 和 \(10 ^ 9\) 的大小关系。 思路1 try-catch 用大数算法直接算,如果算得出来,那就比较;算不出来,也就是溢出了,那么一定是大于 \(1e9\) 的,利用语言特性,捕获这个异常然后输出 \(-1\) 即可。 对应AC代码 import java.math.*; import java.util.*; public class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); try{ BigInteger a = new BigInteger(scanner.next()); int b = scanner.nextInt(); ...
原题:https://fjnuacm.top/d/contest/p/29?tid=635bad6e691055e12dce5282 题意 带佐在数轴上。\(0\) 时刻,带佐位于 \(0\) 处。在时刻 \(i−1\) 和 \(i\) 之间的时间段中,带佐要么待在当前位置,要么向左或向右跳 \(i\) 个单位长度。输出带佐最早在哪个时刻可以到达 \(X\)。 思路 首先,结论是:首项为 \(1\),公差为 \(1\) 的等差数列的前 \(n\) 项和满足 \(S_n > x\) 的最小 \(n\) 即为答案。 下面给出证明思路: 上述结论的做法是: 令 \(m = 满足条件的最小 n\),\(t = Sm - x\),则只需在 \(t\) 时刻停留即可保证最后一步恰好走到 \(x\)。 上述结论的合理性: ① 我们不可能折回,因为折回后如果直接返回,只能前进 \(1\),代价大于在 \(t\) 时刻停留的代价(可以根据等差数列理解,列方程来严格证明),而停留后返回代价明显更大(停留需要很长时间,而折回后返回前进的距离远没有这么长)。 ...
原题:https://fjnuacm.top/d/junior/p/P1304C 空调凉凉~ 题意 一个餐馆中有个空调,给定空调的初始温度为 \(m\),每分钟可以选择上调或下调 \(1\) 个单位的温度,或选择不变。 给定 \(n\) 个食客的到达时间 \(t_i\) 以及所能适应的温度范围 \([l_i, r_i]\),每个食客只会在 \(t_i\) 时刻逗留。 如果温度不在食客的适应范围内,他就会不舒服。输出空调能否使得所有食客都感到舒服。 思路 当初第一反应是维护一个温度值,根据食客的需求改变温度。但这里存在问题:对于有限的操作,最后能落在温度区间的温度是不唯一的。如果是这样,很多种可能叠加,不难发现会超时。 也许我们可以贪心地认为只要满足最低条件即可,但我们不能保证下一个本因可行的区间可能被判为不可行(如一直递增的温度区间)。 单个值失败了,那就多个值呗。 我们只要维护一个区间,让每次所有的可行解落在该区间。然后,对于每一个区间,将其与后面的区间进行区间重叠运算。 对于重叠的区间,有四种可能: 1.可行区间 \(cur\) 和后一个温度区间没 ...