6.26日:
一、完成了pta分600分;
二、对上一周的Java进行了复习和练习,加深了对其的理解和写代码熟练度。
AcWing 665. 倍数
AcWing 660. 零食
AcWing 659. 区间
AcWing 667. 游戏时间
AcWing 670. 动物
AcWing 708. 偶数
AcWing 712. 正数
AcWing 721. 递增序列
AcWing 724. 约数
均用Java代码完成。
6.27日:
一、完成了pta分700分,写代码熟练度越来越高;
二、在算法网站进行算法练习,完成了一下题;
AcWing 4741. 魔法百合井
AcWing 4736. 步行者
AcWing 4738. 快乐子数组
AcWing 4737. 冰壶
AcWing 4672. 布料排序
这些题相对于pta的题,难度更大一点,适合学习算法的同学练习;
三、娱乐,看了熊出没的新电影,意外是熊大熊二的妈妈是机器人。
6.28日:
一、跟朋友去大超市看了电影:《消失的她》,看完吃了豆花鱼,还逛了街,他买了一件衣服,来回都是坐公交出行,虽然慢但是省钱还轻松。
二、晚上温习了树的dfs和bfs
6.29日:
一、复习了树的直径和树的重心,并完成了两道练习题;
#include<bits/stdc++.h> using namespace std; int n,cnt,pre[1001],c[100001],l,q[100001],dist[100001],f[100001]; vector<int>edge[100001]; void dfs(int x)//计算到根的距离 { for(auto y:edge[x]) { if(y!=pre[x]) { pre[y]=x; dist[y]=dist[x]+1; dfs(y); } } } inline void solve(int x)//计算以x为根的子树的大小 { ++cnt; for(auto y:edge[x]) { if(y!=pre[x]) { pre[y]=x; solve(y); } } } int main() { int n;cin>>n; for(int i=1;i<n;i++) { int x,y;cin>>x>>y; edge[x].push_back(y); edge[y].push_back(x); } for(int i=1;i<=n;i++) { f[i]=0; memset(pre,0,sizeof pre); for(auto y:edge[i]) { cnt=0; pre[y]=i; solve(y); f[i]=max(f[i],cnt);//求以i为根的最大的分支 } } int idx=0,v=1<<30; for(int i=1;i<=n;i++) { if(f[i]<v) { v=f[i];idx=i; } } long long ans=0; memset(pre,0,sizeof pre); memset(dist,0,sizeof dist); dfs(idx); for(int i=1;i<=n;i++)ans+=dist[i]; cout<<ans<<endl; }
二、晚上,10:35开始打算法竞赛codeforces,做出了两题,c题不会了;
6.30日:
一、学习了树的lca;
算法的核心代码:
#include<bits/stdc++.h> using namespace std; int n,m,fa[1001],d[1001]; vector<int>edge[1001]; inline void dfs(int x) { for(auto y:edge[x]) { d[y]=d[x]+1; dfs(y); } } int main() { cin>>n; for(int i=1;i<n;i++) { int x,y;cin>>x>>y; edge[x].push_back(y); fa[y]=x; } memset(d,0,sizeof d); dfs(1);//求一号点离任何一个点的距离 cin>>m; for(int i=1;i<=m;i++) { int x,y;cin>>x>>y; if(d[x]<d[y])swap(x,y);//使x的距离大于y的距离 int z=d[x]-d[y];//向上跳的距离 for(int j=1;j<=z;j++)x=fa[x];//向上跳 while(x!=y)//两个一块跳 { x=fa[x];y=fa[y]; } cout<<x<<endl; } }
二、对昨天晚上的c题进行整理,困难(思路很绕,不是很清晰,比较难想);
题目链接:https://mirror.codeforces.com/contest/1845/problem/C
思路:由于m最大为10,且密码数字最大为9,考虑枚举密码的每一位。在 [li, ri] 内枚举第 i 位密码时,如果没有在s内查找到对应字符,那么很显然,已经存在非s的子序列的密码了,如果查找到了,选取在s内相对靠后的数字作为密码,存下这个相对靠后的s下标,枚举下一位密码时,从这个下标继续搜索
代码:
void solve() { string s; cin >> s; int m; cin >> m; string t1, t2; cin >> t1 >> t2; bool f = false; int idx = 0; for (int i = 0; i < m; i++)//枚举m位 { int mx = 0;//最大的下标 for (char j = t1[i]; j <= t2[i]; j++) { int tmp = s.find(j, idx);//返回从k开始的第一个字符j的下标 if (tmp == -1) { f = true; break; } tmp++; if (tmp > mx)mx = tmp; } idx = mx; if (f)break; } if (f)puts("YES"); else puts("NO"); }
7.1日:
一、计划学习Java的数组部分,并完成三道练习题来练练手;
AcWing 708. 偶数
AcWing 712. 正数
AcWing 721. 递增序列
二、完成小学期实验报告b的pta分800分;
三、查漏补缺,补基础算法,看看是否有遗漏的内容没有完全掌握,并进行cf算法训练,备战rom省赛。
标签:pre,int,cin,dfs,第二周,edge,AcWing From: https://www.cnblogs.com/litianyu1969/p/17515886.html