感觉算法还有好多东西没学,但是现在不得不去复习(预习)高数,高数也难,主要是看不下去,心里心心念念的是我算法那么多东西不会,拉下来那么多,最近真的好焦虑,急躁,情绪很低落,今天看到y总敲代码,敲的那么快,很惊讶,原来大佬们每次ak是这种势头,感觉自己像是个没学过算法的人,真感觉自己没有任何题型是能有把握写对的,其实我真的不怕苦也不怕累,但我怕来不及,前面欠下的太多了,太多东西不会了,果然从前那些轻松愉快的日子,都是要还的。
好好想了想,还是要调整自己心态吧,高中的学习经验告诉我,很多时候拼的不止是努力,心态也是很重要的,专心准备高数,担心离散期中考试,就也看看离散,不要给自己太大压力了,反而适得其反,高数慢慢看,算法题每天也保持刷几道吧,加油吧!!!
今天刷了acwing每日一题的两道难题
真的好难嘤嘤嘤
这道题目不难理解,我也大概知道怎么做,但是我的代码写的太长了,还是硬着头皮给他写完了,但是答案错了。
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int i,j;
int mp[1000][1000];
int next[4][2]={ {0,1},
{1,0},
{0,-1},
{-1,0}
};
int q1,q2;
int bfs(int step,int x,int y,int p1,int p2)
{
int tx=x,ty=y;
if(p1==q1 && p2==q2)
return -1;
if(x<1 || x>m || y<1 || y>n)
return step;
if(p1==2)
{
if(p2==7)
{
tx=x+1;
p2=5;
}
if(p2==8)
{
tx=x-1;
p2=6;
}
if(p2==5)
{
ty=y+1;
p2=7;
}
if(p2==6)
{
ty=y-1;
p2=8;
}
}
if(p1==1)
{
if(p2==7)
{
tx=x-1;
p2=6;
}
if(p2==8)
{
tx=x+1;
p2=5;
}
if(p2==5)
{
tx=y-1;
p2=8;
}
if(p2==6)
{
tx=y+1;
p2=7;
}
}
bfs(step+1,tx,ty,mp[tx][ty],p2);
}
int main()
{
char c;
int ans=0;
int book=0;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>c;
if(c=='/')
mp[i][j]=1;
else
mp[i][j]=2;
}
}
for(i=1;i<m;i++)
{
q1=mp[i][1];
q2=5;
if(bfs(1,i,1,mp[i][1],5)==-1)
book=1;
else
ans=min(bfs(1,i,1,mp[i][1],5),ans);
}
for(i=1;i<=m;i++)
{
q1=mp[i][n];
q2=6;
if(bfs(1,i,n,mp[i][n],6)==-1)
book=1;
else
ans=min(bfs(1,i,n,mp[i][n],6),ans);
}
for(i=1;i<=n;i++)
{
q1=mp[1][i];
q2=7;
if(bfs(1,1,i,mp[1][i],7)==-1)
book=1;
else
ans=min(bfs(1,1,i,mp[1][i],7),ans);
}
for(i=1;i<=n;i++)
{
q1=mp[m][i];
q2=8;
if(bfs(1,m,i,mp[m][i],8)==-1)
book=1;
else
ans=min(bfs(1,m,i,mp[m][i],8),ans);
}
if(book==0)
cout<<"-1";
else
cout<<ans;
return 0;
}
#include <iostream>
using namespace std;
const int N = 1e3 + 5;
char g[N][N];
int n, m, ans;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1}; // 上 右 下 左
void dfs(int x, int y, int d, int u) {
ans = max(ans, u);
if (g[x][y] == '/') {
d = d ^ 1;
} else {
d = d ^ 3;
}
int a = x + dx[d], b = y + dy[d];
if (a >= 1 && a <= n && b >= 1 && b <= m) {
dfs(a, b, d, u + 1);
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> g[i][j];
}
}
for (int i = 1; i <= n; i++) {
dfs(i, 1, 1, 1); // 右
dfs(i, m, 3, 1); // 左
}
for (int j = 1; j <= m; j++) {
dfs(1, j, 2, 1); // 下
dfs(n, j, 0, 1); // 上
}
cout << ans << endl;
return 0;
}
然后写了一道并查集的题目
没有任何思路,然后看y总讲课,好像有和图论有什么关系,然后和并查集的环有关系,我顿时人傻了,太晚了,我决定明天再看。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110;
int n;
int a[N],b[N],p[N],s[N];
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
b[x]=i;
}
for(int i=1;i<=n;i++)p[i]=i,s[i]=1;
for(int i=1;i<=n;i++)
{
int x=a[i],y=a[b[x]];
if(find(x)!=find(y))
{
s[find(y)]+=s[find(x)];
p[find(x)]=find(y);
}
}
int cnt=0,mx=0;
for(int i=1;i<=n;i++)
if(p[i]==i && s[i]>1)
{
cnt++;
mx=max(mx,s[i]);
}
if(!cnt)mx=-1;
cout<<cnt<<' '<<mx<<endl;
return 0;
}