引用站外地址,不保证站点的可用性和安全性
洛谷文章链接
xyx404
思路:
引用站外地址,不保证站点的可用性和安全性
参考了 OI Wiki
背包 DP 模版题。
首先定义一个 dpdpdp 数组,其中 dpi,jdp_{i,j}dpi,j 表示第 iii 个物品在背包容量为 jjj 时的最大价值。
考虑转移。
枚举每一个物品在背包容量剩余 jjj 时可以得到的最大价值。
如果现在枚举的剩余容量 jjj 小于选择这个物品需要的容量,那么 dpi,jdp_{i,j}dpi,j 的最大值就是 dpi−1,jdp_{i-1,j}dpi−1,j。
否则有两种情况,选和不选。
对于选的情况,背包的剩余容量会减小这个物品需要的容量,价值会增加这个物品的价值,故此情 ...
洛谷文章链接
思路:
模拟。
定义一个变量 givegivegive 表示现在可以给珠子的人数,再定义一个数组 RRR,RiR_iRi 表示有多少人只能给到第 iii 个人。
每一个成年的人在自己还要珠子的时候必须要给刚刚成年的人一个珠子,所以第 iii 个人要给 n−in-in−i 个珠子,可以得到 givegivegive 个珠子,如果第 iii 个人的数量加上之前成年的人给他的数量不够给后面所有的刚成年的,那么计算他能给到第几个人,更新 RRR 数组,并让 givegivegive 加一还要记得把 AiA_iAi 修改为 000;如果够那么 AiA_iAi 就等于他加上 givegivegive 后给减去他成年后还有多少个未成年的数量,givegivegive 也要加一。
更新完第 iii 个人后让 givegivegive 减去只能给到第 iii 个人的数量,也就是 RiR_iRi。
代码:
#include<bits/stdc++.h>using namespace std;#define LL long long#define itn int#de ...
洛谷文章链接
思路:
BFS。
如没学过,可以先看看 OI Wiki,然后把模版题 P1443 马的遍历做了。
考虑到题目要求,上一次横着走,那下一次就必须竖着走;上一次竖着走,那下一次就必须横着走,所以 BFS 的队列里的变量要多一个变量 cxcxcx 表示上一次走的方向,同时考虑到可能横着走到达这个点不可以到达终点,但是竖着走到达这个点可能可以到达终点,所以标记数组也要多一维,表示方向,当现在到达的点为终点时,说明可以到达输出答案。
其余的就是 BFS 的模版了。
代码:
#include<bits/stdc++.h>using namespace std;#define LL long long#define itn int#define ull unsigned long longint h,w;int sx,sy,ex,ey;bool bj[1200][1200][4];char jz[1200][1200];struct node{ int x,y; int cx;// 上一次的上下/左右/起点 int step;};queue< ...
题目洛谷
思路:
二分答案。
要求找最小值最大,所以考虑二分。
对于每次二分的 midmidmid 最小需要跳跃的距离,进行一次检查,对于检查函数,为了确定编号为 iii 的岩石之前没有被删除的岩石是哪个,要定义一个 lastlastlast 存上一个没有被删除的岩石的编号,每次对比 DiD_iDi 和 DlastD_{last}Dlast 的差,如果小于我们二分到的距离就说明要移走,否则不要移走更新 lastlastlast 为 iii,如果要移走的岩石小于等于最多可以移走的岩石 mmm 说明这种情况是可能的,否则不可能。
答案为每个满足的 midmidmid 中的最大值。
注意起点和终点要在数组里,DDD 数组输入时不会有终点和起点,自行要添加。
代码:
#include<bits/stdc++.h>#define LL long longusing namespace std;LL l,n,m;LL a[50003],maxx;bool check(LL mid){ int last=0,del=0; for(int i=1;i<=n;i+ ...
题目洛谷
题目 AtCoder
思路:
动态规划。
计算出最小编辑距离,并检查其是否小于等于 KKK。
二维动态规划:
现在先考虑二维 dpdpdp 数组的情况。
二维 dpdpdp 数组时,dpi,jdp_{i,j}dpi,j 表示将 SSS 的前 iii 个字符转换为 TTT 的前 jjj 个字符所需的最小操作数。
然后考虑转移。
在动态规划中,dpi,jdp_{i,j}dpi,j 表示将字符串 SSS 的前 iii 个字符转换为字符串 TTT 的前 jjj 个字符所需的最小操作数。为了计算 dpi,jdp_{i,j}dpi,j,我们需要考虑三种可能的操作:删除、插入和替换。
具体来说:
删除:如果我们从 SSS 中删除一个字符,那么 dpi,jdp_{i,j}dpi,j 可以由 dpi−1,jdp_{i-1,j}dpi−1,j 转移而来,因为删除一个字符后,SSS 的前 i−1i-1i−1 个字符需要转换为 TTT 的前 jjj 个字符,这一步对应的操作次数加 111。
插入:如果我们向 SSS 插入一个字符,使得它与 TTT 的第 jjj 个字符匹配,那么 ...
题目
思路:
语法题。
考虑对于 100%100\%100% 的数据,1≤a,b,c≤1091\le a,b,c \le 10^91≤a,b,c≤109,由此需要使用 long long。
正方形的面积为边长乘边长。
长方形的面积为长乘宽。
在输入并计算好面积后判断哪个大就可以了。
代码:
#include<bits/stdc++.h>using namespace std;#define LL long long#define itn int#define ull unsigned long longLL a,b,c;int main(){ cin>>a>>b>>c; a*=a; b*=c; if(a>b)cout<<"Alice"; else cout<<"Bob"; return 0;}
题目
思路:
首先依据常识写出每月的天数。
然后考虑怎么修改最小。
先考虑 MMM 的修改。
为了使修改次数最小我们应尽可能的在 MMM 这个月份不存在时在保证修改次数最小的情况下将他修改成每月天数尽可能多的月份。
依据这个思路 MMM 的修改可以分为两种情况。
月份为 000,我们可以将 MMM 修改为 111,因为 111 月有 313131 天,且在月份为 000 时只用修改一次。
月份大于 121212 时,又可以分为两种情况:当 MMM 是十的倍数时,把月份修改成 101010,因为 101010 月有 313131 天,且当 MMM 是十的倍数时,月份日期的第二个字符一定是 000,由此只用修改一次;当 MMM 不是十的倍数时,又可以分情况,当第二个字符也就是个位为 111 或 222 时,实际上是可以修改第一个字符为 111,但是要依据上面的思想“这个月份不存在时将他修改成每月天数尽可能多的月份”由此当月份为 111111 时修改成 111 月更优,因为 111111 月有 303030 天而 111 月有 313131 天并且都只要修改一次,对于个位不为 111 ...
前言
本文章因为在代码块里使用了 + 可能会出现缩进问题,复制后请检查,有疑问评论区提出。
预览效果
预览效果见本博客统计页面,点击跳转。
实现
1. 新建 charts 页面
可以 Git Bash 里使用 hexo new page charts 命令创建。
2. 引用 echarts.min.js
推荐保存到自己的博客里,文件内容。
以 anzhiyu 主题为例,在主题配置文件的 inject 引入 echarts.min.js。
inject: head: # 自定义css+ - <script src="/js/custom/echarts.min.js"></script>
3. 添加文章统计代码
打开你正在使用的主题目录如 [Blogroot]\themes\anzhiyu,进去后再进入 \scripts\helpers\ 目录。
在此目录新建 charts.js 文件,文件内容如下:
// charts.jsconst cheerio = require('cheerio')co ...
思路:
从一个点出发前往其它点,要求必须到达点的强度严格小于我们的强度的 1X\dfrac{1}{X}X1 倍,每次都可以从我们走过的地方形成的多边形的边上向没有到过的地方。
考虑 bfs。
与 bfs 模版不同的地方就在于每次都可以从我们走过的地方形成的多边形的边上向没有到过的地方,由此可以使用堆进行处理,每次把在边的旁边的点放进堆,每次取力量最小的点走。
如果这时要走到点的强度已经不严格小于现在的强度的 1X\dfrac{1}{X}X1 倍了,那么可以直接输出现在的值,然后结束程序。
可以这样的原因是我们采用了堆并且每次取的的最小强度,那么现在最小强度已经不严格小于现在的强度的 1X\dfrac{1}{X}X1 倍了,后面的强度只会大于或等于最小强度,所以也会是相同的结果,所以可以直接结束。
代码:
#include<bits/stdc++.h>using namespace std;#define LL long long#define itn int#define ull unsigned long longint H,W,p,q,x;LL s[510] ...
题意:
有多组数据。
给出 nnn 个字符串和 kkk 个规则,求每个规则可以组成的所有密码。
在规则中 # 表示的是一个给出的字符串,0 表示的是 000 到 999 中的一个数字。
思路:
深度优先搜索。
深度优先搜索函数传入两个量 nownownow 和 ansansans。
其中 nownownow 表示的是现在是规则里下标为 now+1now+1now+1 字符,ansansans 表示现在搜索到的答案。
当规则里下标为 now+1now+1now+1 字符为 # 时,遍历给出的字符串,对于每一个给出的字符串都放在 ansansans 后进行一次 dfs,注意不能影响后面的操作,如当遍历的是第 iii 个给出的字符串时,不能影响第 i+1i+1i+1 及其之后的操作。
当规则里下标为 now+1now+1now+1 字符为 0 时,把 000 到 999 按顺序放一次,同样不能影响后面的操作。
具体的代码为:
if(r[now]=='#'){// 是一个给出的字符串 for(int i=1;i<=n;i++){ d ...