![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
NOIP题解
蒟蒻一枚
qwq
展开
-
CSPJ2021考完了,你,AK了吗?
CSPJ2021题解,抱歉最近时间紧停更了一个月,你们最喜欢的蒟蒻君回来啦~原创 2021-10-31 14:44:11 · 1221 阅读 · 26 评论 -
NOIP2014提高组Day1T1(生活大爆炸版石头剪刀布)题解
文章目录题目信息解题思路法1:纯模拟(T(n) + O(n))法2:数学优化(T(min{n, na * nb / GCD(na, nb)}) + O(n))代码实现法1法2题目信息题目传送门解题思路法1:纯模拟(T(n) + O(n))模拟n比赛,用两个变量记录两个人出到周期的第几位了,然后判断谁能赢。法2:数学优化(T(min{n, na * nb / GCD(na, nb)}) + O(n))若n ≤ na * nb,即小A和小B已经重新回到na1对nb1了,那么直接按照法1模拟一.原创 2021-09-04 21:40:48 · 369 阅读 · 6 评论 -
NOIP2014普及组T3(螺旋矩阵)题解
文章目录题目信息解题思路法1:模拟(T(n^2^) + O(n^2^))+ 50pts法2:数学(T(1) + O(1)) + 100pts代码实现法1法2题目信息题目传送门解题思路法1:模拟(T(n2) + O(n2))+ 50pts直接用螺旋矩阵的排列方式模拟,一直右下左上。但是…TLE+MLE啊QWQ。法2:数学(T(1) + O(1)) + 100pts细心的小伙伴会发现,我们只需要查询矩阵中的第一个数,也就是说不需要构造出矩阵中所有数。我们可以找到(x, y)在第几圈,然.原创 2021-09-04 17:18:24 · 510 阅读 · 3 评论 -
NOIP2002普及组T2(过河卒)题解
文章目录题目信息解题思路法1:dfs(60pts)法2:dp(正解)代码实现法1法2题目信息题目传送门解题思路法1:dfs(60pts)先算出所有“马的控制点”,然后用深度优先搜索尝试每一条不途径这些点的路径。不熟悉dfs请点这里,这里和这里。法2:dp(正解)定义dpij为从起点走到(i, j)的总方案数。每个点可以从左边或者上边走过来,即dpij = dpi-1j + dpij-1马和马的控制点不能走,即这些地方的dp为0。不熟悉dp请点这里(链接暂空)代码实现法1#i原创 2021-08-26 20:33:13 · 481 阅读 · 1 评论 -
NOIP2014普及组T2(比例简化)题解
文章目录题目信息解题思路:模拟代码实现题目信息题目传送门解题思路:模拟对于一个比例x : y:若(x : y) < (a : b),则x加1,分母相同的情况下最小幅度的增加分数大小;若(x : y) > (a : b),则y加1,分字相同的情况下最小幅度的减小分数大小。注意:有的时候浮点数精确度不够(double双精度是四舍五入至小数点后6位),那么就需要交叉相乘比较,即(x : y) < (a : b)等价于xb < ya。加速(常数级优化)如果x和y不互质原创 2021-08-24 22:01:08 · 823 阅读 · 0 评论 -
NOIP2014普及组T1(珠心算测验)题解
文章目录题目信息解题思路:哈希+二层枚举代码实现题目信息题目传送门解题思路:哈希+二层枚举用数组b记录一个数是否可以被得出。判断b中有多少个数和a中的数相同。代码实现#include <bits/stdc++.h>using namespace std;int a[105];bool b[20005];int main() { int n, sum = 0; cin >> n; for (int i = 1; i <= n; ++i) { c原创 2021-08-24 21:51:08 · 860 阅读 · 0 评论 -
NOIP2015提高组Day2T2(子串)题解
文章目录题目信息解题思路法1:三维dp(no优化,70pts&MLE)法2:法1+滚动数组优化(80pts,TLE)法3:法2+前缀和优化(AC!!)代码实现法1法2法3题目信息题目传送门解题思路法1:三维dp(no优化,70pts&MLE)状态定义定义dpkij为从a的前i个字符中取k个互不重叠的非空子串, 填充b的方案数。边界条件∀dpi00 = 1状态转移 对于每次转移,有以下两种情况(答案为两者之和):条件方案数不使用aidpki-1j原创 2021-08-24 19:28:53 · 371 阅读 · 4 评论 -
NOIP2015提高组Day2T1(跳石头)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路我们可以发现,移走地越多,就越有可能符合要求,即问题符合单调性,可使用二分答案。这样,每次选定一个mid判断去掉mid个shi代码实现...原创 2021-08-24 12:39:19 · 385 阅读 · 2 评论 -
NOIP2015提高组Day1T2(信息传递)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路把每个人看成一个点,信息传递就是边,轮数就是最小环。A传递给B信息,就从A连一条指向B的边,同时更新A的父节点。A到父节点的路径长度 = B到父节点的路径长度 + 1如果两个点A和B的祖先相同,可构成环。长度 = A到父节点的路径长度 + B到父节点的路径长度 + 1代码实现#include <bits/stdc++.h>using namespace std;const int N = 200005;int原创 2021-08-22 21:33:02 · 400 阅读 · 1 评论 -
NOIP2015提高组Day1T1(神奇的幻方)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路按照题面上的方法直接模拟。代码实现#include <bits/stdc++.h>using namespace std;int a[40][40];int n;int main() { cin >> n; int x = 1, y = n / 2 + 1; for (int i = 1; i <= n * n; ++i) { a[x][y] = i;原创 2021-08-21 20:33:27 · 250 阅读 · 0 评论 -
NOIP2015普及组T4(推销员)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路想让答案最大,对于每个x,一定选择最大的s和前x - 1大的a或者前x个最大的a。用sum数组记录a的前缀和,bi记录a数组前i项的最大值,c[i]记录表达式a[i] * 2 + s[i]后i项的最大值。答案 = max(sum[x] + 2 * b[x], sum[x - 1] + c[x])不太熟悉前缀和的童鞋请移步这里。代码实现#include <bits/stdc++.h>using namespace s原创 2021-08-21 20:33:07 · 570 阅读 · 0 评论 -
NOIP2015普及组T3(求和)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路根据y - x = z - y,可得x + z = 2y,即x与z奇偶性相同。所以,奇数和偶数可以分开处理所有颜色。分开后就很好发现:任意两个相同颜色的两个点都可以产生这种三元组。分解多项式:(x1 + x3) * (numberx[1] + numberx[3]) + (x2 + x3) * (numberx[2] + numberx[3])= (x1 + x2) * numberx[3] + (numberx[1] + num原创 2021-08-21 20:32:24 · 581 阅读 · 0 评论 -
历年NOIP/CSP题解(持续更新)
文章目录2020年NOIPCSPJCSPS2019年CSPJCSPS2018年NOIP普及组NOIP提高组2017年NOIP普及组NOIP提高组2016年NOIP普及组NOIP提高组2015年NOIP普及组2020年NOIPNOIP2020T1题解NOIP2020T2题解NOIP2020T3题解NOIP2020T4题解:暂无CSPJCSP-J2020第一题(优秀的拆分)题解CSP-J2020第二题(直播获奖)题解CSP-J2020第三题(表达式)题解CSP-J2020第四题(方格取数)原创 2021-08-20 21:16:51 · 2206 阅读 · 21 评论 -
NOIP2015普及组T1(金币)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路直接模拟。代码实现#include <bits/stdc++.h>using namespace std;int main() { int k; cin >> k; // pre: 目前每天能获得多少金币 // sum: 目前共有多少金币 int pre = 1, sum = 0; // 每次循环模拟n天,每天获得n个金币 for (; k - pre &原创 2021-08-20 19:33:04 · 642 阅读 · 0 评论 -
NOIP2015普及组T2(扫雷游戏)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路对于每个雷,直接输出即可。对于每个问号,看看周围8个点有多少个雷即可。代码实现#include<bits/stdc++.h>using namespace std;// a[i][j]表示地图第n行m列是否有雷bool a[105][105];int main() { int n, m; cin >> n >> m; for (int i = 1; i <=原创 2021-08-20 19:32:15 · 1322 阅读 · 1 评论 -
NOIP2016提高组Day2T1(组合数问题)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路组合数其实可以看成杨辉三角,Cij就是第i行第j列。状态转移方程:Cij = (Ci-1j + Cij-1) % k优化:前缀和(预处理O(n2),查询O(1))不太熟悉前缀和的童鞋请移步there代码实现#include <bits/stdc++.h>using namespace std;const int N = 2e3 + 5;int t, k, n, m;int c[N][N], s[N][N];原创 2021-08-20 19:15:38 · 266 阅读 · 0 评论 -
NOIP2016提高组Day1T1(玩具谜题)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路移动方向只取决于两个因素:面朝方向和向左还是右走。通过数组模拟,大于n则%=n(转了一圈还是起点),小于0要 += n(至少要走到起点后)。代码实现#include <bits/stdc++.h> using namespace std;const int N = 1e5 + 5;bool dir[N];string name[N]; int main() { int n, m; cin >>原创 2021-08-19 21:13:01 · 252 阅读 · 0 评论 -
NOIP2013提高组华容道题解
文章目录题目信息解题思路代码实现(有错待改,注释待加)题目信息题目传送门解题思路在这道题中,我们肯定会想到用bfs找最短路的想法。但是,并不是所有棋子的状态都是需要记录哒(这样就会TMLE得更多啦)。在棋子移动的过程中,除了和目标棋子换的时候,空的位置已知可以和别的棋子换,所以我们只需要记录空的位置和目标棋子的位置就ok啦。代码实现(有错待改,注释待加)#include <bits/stdc++.h>using namespace std;const int N = 30;co原创 2021-08-18 22:08:45 · 308 阅读 · 0 评论 -
NOIP2016普及组T4(魔法阵)题解
题目信息题目传送门解题思路在此图中,A表示xa,B表示xb,C表示xc,D表示xd,那么这四个点就能组成一个魔法阵。令k = xd - xc。根据题目条件可得:xb - xa = 2kxc - xb > 6k综上,可求出:1 ≤ k ≤ n / 9所以我们可以枚举k和d的位置,这样就可以确定C和D的值了。定义sumi为第i中方案数(算完了记录后马上改变),那么:sumd = suma * sumb * sumcsumc = suma * sumb * sumd同理原创 2021-08-18 22:05:05 · 829 阅读 · 0 评论 -
NOIP2016普及组T3(海港)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路用队列存储时间。用cnt数组存储每个国籍有多少人。每次输入时判断:若没有这个国籍的人,就新建一个国籍。如果第一个人到达的时间比当前时间晚,就跳到下一个人。把这个人删掉。如果这个人是他的国籍的唯一一个人,则删除这个国籍。重复前两部操作,直到第一个人到达的时间小于等于当前时间。代码实现#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 5原创 2021-08-18 17:17:37 · 491 阅读 · 0 评论 -
NOIP2016普及组T2(回文日期)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路枚举月和日,判断后四位翻转过来的八位数是否合法即可。tips:二月不用特殊处理,因为0229翻转过来的9220是闰年。代码实现#include <bits/stdc++.h> using namespace std;int day[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int main() { int n, m, res = 0;原创 2021-08-17 13:01:58 · 694 阅读 · 0 评论 -
NOIP2016普及组T1(买铅笔)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路求出三种价格取最小,无坑。代码实现#include <bits/stdc++.h>using namespace std;int main() { int n, res = 1e9; cin >> n; for (int i = 0; i < 3; ++i) { int x, y; cin >> x >> y;原创 2021-08-17 12:50:13 · 692 阅读 · 0 评论 -
洛谷P1032字串变换题解
文章目录题目信息解题思路:BFS代码实现题目信息题目传送门解题思路:BFS每次字符串入队找可以执行的操作(看一下有没有可以修改的串)。修改后入队,记录修改次数。tips:每次找处理完后要继续找这个字符串后是否有可以修改的子串。代码实现#include <bits/stdc++.h>using namespace std;string a, b;string A[7], B[7];struct node { // 当前字符串 string pre;原创 2021-08-17 11:25:56 · 151 阅读 · 0 评论 -
洛谷P1015回文串题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路直接暴力模拟。代码实现#include <bits/stdc++.h>using namespace std;char s[2005];int n;vector<int> a, b;int main() { cin >> n >> s; for (int i = 0; i < strlen(s); ++i) { if (s[i] >= '原创 2021-08-17 11:15:07 · 195 阅读 · 0 评论 -
NOIP2017提高组Day2T1(奶酪)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路找出一个处于奶酪下表面的点,枚举相邻点找到合法状态后再dfs一遍就ok了代码实现#include <bits/stdc++.h>using namespace std;const int N = 1005;struct pos { double x, y, z;} p[N];long long t, n, r, h;bool a[N], f;// 求两点是否相邻inline bool dis(pos a原创 2021-08-16 22:00:19 · 323 阅读 · 1 评论 -
NOIP2017提高组Day1T2(时间复杂度)题解
文章目录题目信息解题思路题目分析代码实现题目信息题目传送门解题思路题目分析一层循环可能:不会执行(执行0次)执行常数次执行n次错误的原因有:变量重名F与E匹配失败代码实现...原创 2021-08-16 21:46:58 · 235 阅读 · 0 评论 -
NOIP2017提高组Day1T1(小凯的疑惑)题解
文章目录题目信息解题思路结论证明:反证法代码实现题目信息题目传送门解题思路小凯他不会百度吗?!结论若a和b满足gcd(a, b) == 1,即a与b互质,等式ax + by = n中n的最大值为ab - a - b。证明:反证法我们可以试着证明这个东东是错的,即:ax + by ≠ ab - a - b假设存在x和y符合条件,则证明:代码实现#include <bits/stdc++.h>using namespace std;int main() { i原创 2021-08-16 17:41:34 · 344 阅读 · 0 评论 -
NOIP2017普及组T4(跳房子)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路仔细观察就很容易发现,若用i个金币改造仍然无法得k分的话,那么比若金币数<i肯定也不行。也就是说,这道题是具有单调性的于是我们就可以想到这道题可以二分答案代码实现...原创 2021-08-16 17:10:04 · 336 阅读 · 0 评论 -
NOIP2017普及组T3(棋盘)题解
文章目录题目大意解题思路:最短路代码实现题目大意题目传送门解题思路:最短路空白只能是用魔法弄来的,但它后面的点必须有颜色。所以我们可以用优先队列记录到每个点的最少花费,原数组不动。其他的和dij几乎一样。因为是优先队列,每个点进入队列一次就可以,后面来的花费肯定更多啦。不太熟悉dij的同学可以看这里代码实现...原创 2021-07-30 15:05:13 · 616 阅读 · 0 评论 -
NOIP2017普及组T2(图书管理员)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路按照题目要求模拟。代码实现#include<bits/stdc++.h>using namespace std;const int mod[9] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};int b[1000];int main() { int n, q; cin >> n >> q;原创 2021-07-29 15:38:51 · 640 阅读 · 1 评论 -
NOIP2017普及组T1(成绩)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路按照题目要求计算即可。代码实现#include <bits/stdc++.h>using namespace std;int main() { int a, b, c; cin >> a >> b >> c; cout << a * 0.2 + b * 0.3 + c * 0.5 << '\n'; return 0;}...原创 2021-07-29 15:26:47 · 473 阅读 · 0 评论 -
NOIP2018提高组Day1T2(货币系统)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路将a数组升序排列先选择最小的数,再利用完全背包的思想,从ai(目前判断到的值)到最大值筛选,可以组成的标记一下。在没有被打过标记的数中再次筛选。不太熟悉完全背包的同学可以看这里。代码实现#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 5, M = 25000;int a[N];bool vis[M];int main() {原创 2021-07-29 15:08:27 · 252 阅读 · 1 评论 -
NOIP2018提高组Day1T1(铺设道路)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路假设现在有相邻的两个坑(设深度左小右大),下标为i - 1和i,那么我们肯定会选择将这两个坑的深度同时 - 1(可以带上其它坑)。当小坑填完时,大坑的深度也减少了d[i] - d[i - 1]。得出结论: 代码实现#include <bits/stdc++.h>using namespace std;const int N = 100000; int d[N];int main() { int n; cin原创 2021-07-28 21:35:42 · 396 阅读 · 5 评论 -
CSPS2019Day2T1(Emiya家今天的饭)题解
文章目录题目信息解题思路:dp代码实现题目信息题目传送门解题思路:dp对于一种做菜方案,至多只有一种主要食材在超过[k/2]道菜里出现过。所以我们可以用排除法,用总方案数 - 不合法方案数即可。我们需要枚举主要食材,dp[i][j][k]代表前i种方式中包含j种食材,有k种烹饪方式未使用的方案数。对于任意x,若x > [k / 2],则2x + n - k > n。因此,可以将使用过某种食材的菜看作使用两次此食材,并为每种烹饪方式加一种每种食材都用过一次的菜。原创 2021-07-28 18:18:21 · 306 阅读 · 1 评论 -
CSPS2019Day1T2(括号树)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路代码实现原创 2021-07-28 14:45:30 · 627 阅读 · 1 评论 -
CSPS2019Day1T1(格雷码)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路第0位:011001100110011…第1位:0011110000111100001111……第i位:k xor(异或)[2 / k]的第i位。代码实现#include <bits/stdc++.h>using namespace std;int main() { int n; unsigned long long k; cin >> n >> k; k ^=原创 2021-07-28 10:53:53 · 349 阅读 · 0 评论 -
NOIP2018T3(摆渡车)题解
NOIP经典题目~原创 2021-07-27 21:55:58 · 504 阅读 · 1 评论 -
NOIP2018普及组T4(对称二叉树)题解
NOIP经典题目题解~原创 2021-07-27 19:27:24 · 472 阅读 · 0 评论 -
NOIP2018普及组T2(龙虎斗)题解
NOIP经典题目~原创 2021-07-27 15:15:38 · 507 阅读 · 2 评论 -
NOIP2018普及组T1(标题统计)题解
经典NOIP题目~原创 2021-07-27 15:01:15 · 740 阅读 · 2 评论