题目链接:Palindromic Paths 题意: 给你一个n行m列的矩阵,这个矩阵被0或者1所填充,你需要从点(1,1)走到点(n,m).这个时候会有很多路径,每一条路径对应一个01串,你可以改变这个矩阵中某些位置的值,你需要保证改变之后每一条路径串都是回文串. 最后输出你最少需要改变多少位置 题解: 因为你要保证每一条路径都是回文路径,那么如下面这组样例: 3 5 1 0 1 0 0 1 1 1 1 0 0 0 1 0 0 起点位置(1,1)的值是1但是终点位置(n,m)的值是0,但是在一…
题目链接:https://codeforces.com/contest/1366/problem/C 题意 有一个 $n \times m$ 的 $01$迷宫,要使从 $(1,1)$ 到 $(n,m)$ 的所有路径均为回文串,至少要变换多少字符. 题解一 用 $bfs$ 得到回文串每个位置可能的 $01$ 个数,对称位置变换 $01$ 总个数中的较少值即可. 代码 #include <bits/stdc++.h> using namespace std; const int dir[4][2]…
题意:有一个\(n\)x\(m\)的矩阵,从\((1,1)\)出发走到\((n,m)\),问最少修改多少个数,使得所有路径上的数对应相等(e.g:\((1,2)\)和\((n-1,m)\)或\((2,1)\)和\((n,m-1)\)). 题解:我们将二维的点的坐标转化为一维的步数(到\((1,1)\)的路径),统计所有步数相同的数字,然后枚举步数及相对应位置的数字,这些位置上的所有数字都应该相等,所以取一个\(0\)和\(1\)出现次数的最小值即可. 代码: #include <iostream…
题目链接:https://codeforces.com/contest/1366/problem/B 题意 大小为 $n$ 的数组 $a$,除了 $a_x = 1$,其余 $a_i = 0$,依次给出 $m$ 个区间,可以选择区间中的两个元素交换(可相同),问最多有多少个元素可能为 $1$ . 题解 如果一个区间包含 $x$,那么可能为 $1$ 的元素范围即扩大至了整个区间,对于接下来的区间,判断是否与当前可能为 $1$ 的区间相交即可,相交则继续扩大区间范围,如此重复. 判断两个区间是否相交:…
题目链接:https://codeforces.com/contest/1366/problem/A 题意 有两个数 $a$ 和 $b$,每次可以选择从一个数中取 $2$,另一个数中取 $1$,问最多可以进行多少次这样的操作. 题解一 比较好想的一种模拟的做法: 较多者每次取两个至二者相等 二者每次同时取三个 如果较多者和较少者有余再加一 代码 #include <bits/stdc++.h> using namespace std; void solve() { int a, b; cin…
题目链接:A.Shovels and Swords 题意: 你需要一个木棍和两个钻石可以造出来一把剑 你需要两个木棍和一个钻石可以造出来一把铁锹 你现在有a个木棍,b个钻石,问你最多可以造出来几件东西 题解: 分两种情况,第一种: 如果max(a,b)>=2*min(a,b),那么最多可以造出来min(a,b)件物品 第二种: 排除第一种情况后,假设我们最多造出来了x把铁锹,y把剑 2x+y<=a x+2y<=b 两个式子相加得到: 3(x+y)<=a+b,即x+y<=(a+…
题目链接:D:Two Divisors 题意: 给你n个数,对于每一个数vi,你需要找出来它的两个因子d1,d2.这两个因子要保证gcd(d1+d2,vi)==1.输出的时候输出两行,第一行输出每一个数vi对应的第一个因子d1,第二行对应位置输出第二个因子d2 题解: 最大公约数有两个基本性质如下: gcd(a,b)=gcd(a±b,b)=gcd(a,b±a); if(gcd(a,b)==1) gcd(a,bc)=gcd(a,c); 设p1.p2.p3...pm是一个数x的所有质因子,我们设d1…
题意:你有\(a\)个树枝和\(b\)个钻石,\(2\)个树枝和\(1\)个钻石能造一个铁铲,\(1\)个树枝和\(2\)个钻石能造一把剑,问最多能造多少铲子和剑. 题解:如果\(a\le b\),若\(b\ge 2a\),那么一直取\(b\)即可,否则就要两两轮流减,即\((a+b)/3\),取个min即可. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath&…
题意:有\(n\)组数,对于每组数,问是否能找到两个因子\(d_{1},d{2}\),使得\(gcd(d_{1}+d_{2},a_{i}=1)\),如果有,输出它们,否则输出\(-1\). 题解:对于这题,首先我们要推两个gcd的公式: ​ 1) $gcd(a,b)=gcd(a+b,b) $. ​ 2) 若\(gcd(a,c)=1 \ => gcd(a,bc)=gcd(a,b)\). 这两个公式应该都很容易证明. 因此我们推出:若\(gcd(x,y)=1\),则:\(gcd(x+y,xy)=1\…
题意:有长为\(n\)的排列,其中\(x\)位置上的数为\(1\),其余位置全为\(0\),询问\(m\)次,每次询问一个区间,在这个区间内可以交换任意两个位置上的数,问\(1\)最后出现在不同位置的次数. 题解:维护区间即可,如果某个区间包含了\(1\),更新最大的答案区间,(每次更新后说明这整个区间都能取到\(1\)). 代码: #include <iostream> #include <cstdio> #include <cstring> #include <…