04 2021 档案
摘要:给定块木板来覆盖一些区间,希望块木板的总长度最小。 先假设只有一块木板从编号最小的牛棚一直铺到编号最大的牛棚,然后选取个区间将一块木板分成块木板。 贪心策略:优先断开相邻编号差较大的区间。 const int N=210; int a[N],b[N]; int n,m,k
阅读全文
摘要:首先写了个较为暴力的代码。 const int N=1010; bool sex[N]; double sum[N][N]; int n,m; void print(int a,int b) { if(!sex[a]) cout<<'-'; cout<<a<<' '; if(!sex[b]) cou
阅读全文
摘要:开个桶进行统计,老套路了。 const int N=10010; struct Node { int id; int cnt; int money; bool operator<(const Node &W) const { if(money != W.money) return money > W
阅读全文
摘要:模拟。 注意点 所有未与 E 记录配对的 S 记录以及未与 S 记录配对的 E 记录都必须忽略。 const int N=1010; struct Node { int st_tim; int ed_tim; }a[N]; bool borrow[N]; int n; int calc(int hh
阅读全文
摘要:本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。 输入格式: 输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的
阅读全文
摘要:模拟除法的过程就好了,并不需要高精度了。 int main() { int x; cin>>x; int r=0; int cnt=0; bool first=true; while(true) { r=r*10+1; cnt++; if(first && r/x) // 第一个不为0的商作为最高位
阅读全文
摘要:题目保证不存在两个人是同名的。 找最近公共祖先使用向上标记法。 const int N=10010; unordered_map<string,string> fa; unordered_map<string,bool> sex; int n,m; bool check(string a,strin
阅读全文
摘要:又是喜闻乐见的字符串题==。 int main() { int T; cin>>T; cin.ignore(); while(T--) { string s; getline(cin,s); vector<string> res; stringstream ss(s); string word; b
阅读全文
摘要:水题~。 int main() { string s; getline(cin,s); for(int i=0;i<s.size();i++) if(s[i] == '6') { int j=i; while(j<s.size() && s[j] == '6') j++; if(j-i > 9) c
阅读全文
摘要:水题。 int h[]={129,130}; int w[]={25,27}; int main() { int T; cin>>T; while(T--) { int sex,height,weight; cin>>sex>>height>>weight; vector<string> res;
阅读全文
摘要:水题~。 const int N=5010,M=10010; string follow[N]; unordered_set<string> S; pair<string,int> name[M]; int n,m; int main() { cin>>n; for(int i=0;i<n;i++)
阅读全文
摘要:合法的出栈序列。 注意和1051 Pop Sequence (25 分)的区别。 上题要求必须出栈元素必须入栈,而本题出栈元素并不是必须入栈。 int n,m,k; int main() { cin>>n>>m>>k; while(k--) { vector<int> a(n); for(int i
阅读全文
摘要:题意巨绕T_T。 是洛希极限和大天体半径的比值,是两天体距离和大天体半径的比值。 分母上都有大天体半径,比较相对大小即可。 double rho; bool type; int distdivr; int main() { cin>>rho>>type>>distdiv
阅读全文
摘要:水题~。 const int N=1010; double a[N]; int n; int main() { cin>>n; double sum=0; for(int i=0;i<n;i++) { cin>>a[i]; sum+=1/a[i]; } printf("%.2f\n",n/sum);
阅读全文
摘要:水题~。 int main() { int a[4],low,maxv=0,range; cin>>a[0]>>a[1]>>a[2]>>a[3]>>low>>range; for(int i=0;i<4;i++) maxv=max(maxv,a[i]); vector<int> res; for(i
阅读全文
摘要:水题~,直接库函数解决。 int n,m; int main() { string line; string s="chi1 huo3 guo1"; int tot=0,cnt=0,ans=0; while(getline(cin,line)) { if(line == ".") break; to
阅读全文
摘要:二进制水题~。 int n,m; int main() { cin>>n>>m; while(m--) { string s; cin>>s; int res=0; for(int i=0;i<s.size();i++) if(s[i] == 'n') res+=1<<(n-1-i); cout<<
阅读全文
摘要:按题意模拟即可。 bool vis[10]; int g[5][5]; int sum[10]; int m; int mp[]={0,0,0,0,0,0,10000,36,720,360,80,252,108,72,54,180,72,180,119,36,306,1080,144,1800,36
阅读全文
摘要:身份证号必须是 位的数字,数字,数字,大概是眼瞎了。 同一个身份证号若在第 i 天申请成功,则接下来的 P 天不能再次申请。也就是说,若第 i 天申请成功,则等到第 i+P+1 天才能再次申请; 按照提交时间的先后顺序发放,直至全部记录处理完毕或 S个名额用完。如果提交时间相同,则按照
阅读全文
摘要:水题~。 const int N=1010; int a[N]; stack<int> num; stack<char> opt; int n; int main() { cin>>n; for(int i=0;i<n;i++) { int x; cin>>x; num.push(x); } for
阅读全文
摘要:水题。 const int N=210; int g[N][N]; int n,m,q; int tot,ans,idx; int main() { cin>>n>>m; memset(g,0x3f,sizeof g); while(m--) { int a,b,c; cin>>a>>b>>c; g
阅读全文
摘要:水题。 const int N=1e5+10; int a[N]; int n; int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); int res=0; for(int i=0;i<n/2;i++) res+=a[n-
阅读全文
摘要:按题意模拟就好了...咳咳。 数组判断每轮迭代至数字的过程中是否出现过重复数字。 哈希表存储迭代过程中产生的中间数字,以便最后输出答案时过滤掉依附于其他数字的幸福数。 const int N=1e4+10; bool vis[N]; int l,r; unordered_set
阅读全文
摘要:根据完全二叉树的性质(编号为的节点的左儿子编号为,右儿子编号为),并利用后序遍历进行递归建树。 存储编号为的节点的值。 const int N=35; int post[N]; int level[N]; int n; int k; void df
阅读全文
摘要:水题~。 const int N=1e5+10; vector<int> g[N]; int din[N]; int dist[N]; int n; int idx; void bfs(int st) { queue<int> q; q.push(st); dist[st]=0; whil
阅读全文
摘要:水题~。 注意边界:只有一个节点且是得道者。 const int N=1e5+10; vector<int> g[N]; double expand[N]; int n; double m,r; double sum; void dfs(int u,double power)
阅读全文
摘要:5717. 最少操作使数组递增 签到题,每个数至少比前一个数的数值大一,即可满足严格递增。 class Solution { public: int minOperations(vector<int>& nums) { int res=0; for(int i=1;i<nums.size();i++
阅读全文
摘要:水题~。 const int N=10010; struct Node { string name; int grade; int rank; bool operator<(const Node &W) const { if(grade != W.grade) return grade > W.gr
阅读全文
摘要:并查集裸题。 const int N=10010; int p[N]; int n,m,maxid; int find(int x) { if(x != p[x]) p[x]=find(p[x]); return p[x]; } int main() { cin>>n; for(int i=1;i<
阅读全文
摘要:宽搜就完事了。 const int N=1e5+10; vector<int> g[N]; int dep[N],maxd; int n; void bfs(int root) { queue<int> q; q.push(root); dep[root]=1; while(q.size()) {
阅读全文
摘要:水~。 将给定的点标记已访问,判断其他点是否还存在未标记访问的邻接点。若存在,说明剩余的点不孤立;否则剩余的全为孤立点。 const int N=10010; vector<int> g[N]; bool vis[N]; int n,m,q; bool dfs(int u) { for(int i=
阅读全文
摘要:不妨假设第一个日期早于第二个日期(否则交换即可)。 这种求日期之间相差天数的题目有一个很直接的思路,即令日期不断加1天,直到第一个日期等于第二个日期为止,即可统计出答案。具体处理时,如果当加了一天之后天数d等于当前月份m所拥有的天数加1,那么就令月份m加1、同时置天数d为1号(即把日期变为下一个月的
阅读全文
摘要:又是喜闻乐见的日期题。 枚举年份,构造回文日期和ABABBABA型的回文日期,判断构造出的日期是否合法。 注意构造出的日期不能和当前日期相等。 int month[2][13]={ {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,
阅读全文
摘要:线段树裸题。 单点修改+区间查询。 const int N=2e5+10; struct Node { int l,r; int maxv; }tr[N<<2]; int score[N]; int n,m; void pushup(int u) { tr[u].maxv=max(tr[lc].ma
阅读全文
摘要:传递闭包裸题。 如果一头奶牛和其他头奶牛的大小关系都确定了,那么该奶牛的排名可唯一确定。 或者说,比它强的奶牛的数量加上比它弱的奶牛的数量等于,就可唯一确定该奶牛的名次。 const int N=110; bool g[N][N]; int n,m; void floyd() {
阅读全文
摘要:将单词表中所有单词建立一棵字典树,再利用 数组统计字典树中以每个字母结尾的字符串的个数。因此,在接下来的多次询问中,只需要返回单词最后一个字母对应的数组值即可。 const int N=5e5+10; int trie[N][26],cnt[N],idx; void insert
阅读全文
摘要:状态表示: :表示以为根的子树,不打劫的情况下所能获取的最大价值。 :表示以为根的子树,打劫的情况下所能获取的最大价值。 状态转移: \[ f(u,0)=\sum_{j\in Son(u)} \max(f(j,0),f(j,1)) \\
阅读全文
摘要:首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。 注意到当房屋数量不超过两间时,最多只能偷窃一间房屋,因此不需要考虑首尾相连的问题。如果房
阅读全文
摘要:解法一 状态表示: :表示考虑前家商店且不窃取第家店铺的情况下所获得的最大价值。 :表示考虑前家商店且窃取第家店铺的情况下所获得的最大价值。 状态转移: \[ f(i,0)=\max(f(i-1,0),f(i-1,1)) \\ f(i,
阅读全文
摘要:最小值最大,显然二分了。 check()函数判断当前相邻点距离为的情况下能选处多少个点,若选出的点的数量大于等于则满足要求,可继续扩大左边界。 注意点 左边界取为,因为存在所有数均相等的情况,此时的答案为。 const int N=1e5+10; int a[N]; in
阅读全文
摘要:在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。 /** * Definition for singly-linked list. * struct ListNode
阅读全文
摘要:题意 一棵根为的树,选择性切掉一些边,求使得所有的叶子都不能到达根的最小代价。 思路 树形。 树型本质上可以说是个搜索——遍历这棵树,在返回的时候维护相关的值。 不管是写还是写搜索其实都是要分析原问题和子问题分别是什么的,我们的原问题是以为根的子树删掉权值和尽量小
阅读全文
摘要:上一题POJ 2955 Brackets求的是满足完美匹配的最大括号数量,而这题问的是使所有括号完美匹配需要添加的最小括号数量。 要使添加的括号尽量少,我们需要使原来的括号序列尽可能多得匹配,先求最大匹配数量,那么还剩下一些没有匹配的括号,我们就需要依次加上一个括号使它们得到匹配。 状态表示: \(
阅读全文
摘要:我们给出了“正则括号”序列的以下归纳定义: 空序列是一个 正则方括号序列; 如果s是正则方括号序列,那么(s)和[s]是正则括号序列; 如果a和b是正则括号序列,则ab是正则括号序列; 没有其他序列是正则括号序列。 例如,以下所有字符序列都是正则括号序列: (),[], (()), ()[], ()
阅读全文
摘要:\[ f_n = f_{n-1}+f_{n-2} \\ S_n=S_{n-1}+f_n \\ [f_n,f_{n-1},S_n]= [f_{n-1},f_{n-2},S_{n-1}] \begin{bmatrix} 1 & 1 & 1\\ 1 & 0 & 1\\ 0 & 0 & 1 \end{bma
阅读全文
摘要:整数划分问题:900. 整数划分 注意划分出的数可以取。 const int N=1010; int f[N][N]; int n,m; int main() { int T; cin>>T; while(T--) { memset(f,0,sizeof f); cin>>m>>n; f[0]
阅读全文
摘要:最大子段和的树上扩展。 状态表示: :在以为根的子树中包含u的所有连通块中的权值的最大值。 状态转移: 如果子树中存在权值和为正的连通块,则包含上该子树,否则丢弃。 \[ f[u]=w[u]+\max(f[s_1],0)+\max(f[s_2],0)+\cdots+\max(f
阅读全文
摘要:要求最少添加几个字符,我们可以先从原串中找到一个最长回文子序列,然后对于原串中不属于这个回文子序列的字符,在它关于回文子序列中心的对称位置添加一个相同字符即可。那么需要添加的字符数量即为n-最长回文串长度。 const int N=1010; int f[N][N]; char s[N]; int
阅读全文
摘要:状态表示: :表示以结点u为根的子树上留j条边时的最多苹果数量。 状态转移: 状态转移方程如何设计?下面给出2种思路,二叉树方法、多叉树(一般性)方法。 (1)二叉树 本题是一棵二叉树,根据二叉树的特征,考虑u的左右子树,如果左子树共留条边(不包含$u \righ
阅读全文
摘要:需要考虑和节点相邻的节点的选择情况,所以既要看儿子,也要看父亲。选择,选择的儿子,选择的父亲都对子树答案有影响。 对节点来说,被支配的情况有三种:选择自身,选择的父亲,选择的儿子,三种情况选择其一即可使得被支配。 状态表示: \(f(u,0
阅读全文
摘要:状态表示: 对于任意一条边,要么在父亲放士兵,要么在儿子放士兵。 :以为根的子树在上不放置的士兵的情况下,最少所需的士兵数目。 :以为根的子树在上放置的士兵的情况下,最少所需的士兵数目。 状态转移: 上放置士兵,的儿子们可放
阅读全文
摘要:状态表示: 父亲和儿子不能同时选,父节点选或不选会影响子树的结果。 表示不选时,以为根的子树快乐质数总和的最大值。此时,的子节点可以参加,也可以不参加; 表示选时,以为根的子树快乐质数总和的最大值。此时,的所有子节点都不能参加
阅读全文
摘要:树的重心模板。 自底向上进行统计以每个结点u为根的子树大小。 对于一个节点u,如果我们把它从树中删除,那么原来的一棵树可能会分成若干个不相连的部分,其中每一部分都是一颗子树。 设maxpart表示在删除节点u之后产生的子树中,最大的一颗的大小。使maxpart取到最小值的节点就是树的重心。 cons
阅读全文
摘要:前缀异或,异或两次为,而与任何数异或值都不变。 const int N=1e5+10; int a[N]; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; a[i]^=a[i-1
阅读全文
摘要:水题~。 int main() { string s; cin>>s; sort(s.begin(),s.end(),greater<int>()); cout<<s<<' '; reverse(s.begin(),s.end()); int idx=0; while(s[0] == '0' &&
阅读全文
摘要:注意细节。 const int N=1010; char s[N]; int n; int main() { while(~scanf("%s",s)) { n=strlen(s); vector<int> res; int num=0; bool have=false; for(int i=0;i
阅读全文
摘要:看到括号匹配当然想到栈了。 int main() { string s; while(cin>>s) { stack<char> stk; for(int i=0;i<s.size();i++) { if(s[i] == '(') stk.push(s[i]); else if(s[i] == ')
阅读全文
摘要:打表,先把小于等于 N 的且与 7 无关的正整数找出来,然后再预处理出小于等于N的这些正整数平方和。 const int N=1e6+10; bool vis[N]; LL sum[N]; bool check(int x) { if(x % 7 == 0) return true; while(x
阅读全文
摘要:打表,把所有出现的位置存起来。 unordered_set<int> S; void init() { for(int i=1,d=1;i<=1e9;) { S.insert(i); i+=d; d++; } } int main() { init(); int T; cin>>T; whil
阅读全文
摘要:\[ [F(n,1),F(n,2),F(n-1,1),F(n-1,2),F(n-2,1),F(n-2,2),1]=\\ [F(n-1,1),F(n-1,2),F(n-2,1),F(n-2,2),F(n-3,1),F(n-3,2),1] \begin{bmatrix} 0 & 1 & 1 & 0 &
阅读全文
摘要:裸题。 const int N=1e5+10; int a[N]; int n; int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; int res=0; int sum=0; for(int i=0;i<n;i++) { sum=max(sum
阅读全文
摘要:可以通过无限次的换车来完成旅程,每次换车又可以走大小为的距离,完全背包裸题,即体积大小为的每种物品均为无限个。 const int N=510; int f[N]; int a[N]; int n; int main() { for(int i=1;i<=
阅读全文
摘要:又是图形输出题。 找规律代码如下。 int main() { int T; cin>>T; while(T--) { int a,b; cin>>a>>b; for(int k=0;k<b;k++) { for(int i=0;i<a/2;i++) { for(int j=0;j<i;j++) co
阅读全文
摘要:传递闭包+乘法原理+高精。 变换具有传递性,如,,则有变换。 首先我们根据输入的变换规则构造一个图,其顶点为这个数字,边 权值为1表示规则,否则为。于是可以根据Floyd算法求出图的传递闭包。那么
阅读全文
摘要:爬楼梯水题~。 const int N=45; bool vis[N]; int f[N]; int n,m; int main() { cin>>n>>m; for(int i=0;i<m;i++) { int x; cin>>x; vis[x]=true; } f[1]=1; for(int i
阅读全文
摘要:时做过了,再做一遍,直接模拟即可。 输入保证四位数字不全相同。 int a[5]; int n; void get(int x) { for(int i=3;i>=0;i--) a[i]=x%10,x/=10; } int calc() { int res=0; for(int i=0;i
阅读全文
摘要: const int N=2e5+10; int a[N]; LL sum[N]; int n; int main() { cin>>n; for
阅读全文
摘要:水题~。 int n; bool isprime(int x) { if(x<2) return false; for(int i=2;i*i<=x;i++) if(x % i == 0) return false; return true; } bool palindrome(int x) { i
阅读全文
摘要:由于正方形边上的目标不会摧毁,所以如果按照左图的形式来投放炸弹,实际只能摧毁个点,但如果按照右图的形式来投放炸弹,则能摧毁个目标,题目要求摧毁总价值最大的边长为的正方型区域,显然按右图的形式来计算。 采用二维前缀和计算。 const i
阅读全文
摘要:如果不考虑特殊区间,对于每个元素来说,既可以染成黑色从而得到, 也可以染成白色从而得到,当然最好是染成黑色和白色两者中较大的从 而得到。 现考虑特殊区间,由于本题已保证个区间两两不相交,因此可以单独考 虑每个区间,如果把区间染成同一种颜色后得到
阅读全文
摘要:对于每一个数n,除非它是完全平方数,否则它一定有偶数个因子。 因为如果i是n的因子,那么n/i也一定是n的因子。这样,n的因子都是成对出现的,所以n有偶数个因子 但是,有一种特殊情况,即n/i=i。由于i和n/i是同一个数,因子只能是一个,这时n的因子就是奇数个。 把n/i=i变形,得n=i*i,即
阅读全文
摘要:先将所有奶牛的坐标从小到大排序,然后通过双指针(也可以二分)查找第一个超出第头奶牛交流范围的奶牛的坐标,同时答案累加上(和第头奶牛范围不超过的奶牛数,减一是除去第头奶牛自身)。 const int N=1e6+10; int a[N]; int n,
阅读全文
摘要:直接模拟即可。 const int N=110; char g[N][N]; int n,m; bool check(int x,int y) { return x>=0 && x<n && y>=0 && y<m; } int count(int x,int y) { int res=0; for
阅读全文
摘要:圆圈的长为 ,逆时针记为:,而大圣每次飞的距离为 。 大圣所在的位置记为 ,而大圣想去的地方在 ,且筋斗云只沿着逆时针方向翻,告诉大圣至少要飞多少次才能到达目的地。 思路 假设飞次到达目的地。 则满足:\((x+m*d) \
阅读全文
摘要:思路 要求包含这 N 个整数的最短的等差数列有几项,则首项取数组中的最小值,末项取数组中的最大值。 假设公差为,首相为,则相邻两项的差一定是公差的倍数,于是对所有相邻两项的差求即可得到公差。 con
阅读全文