(准备高数期中)5月1号算法学习

感觉算法还有好多东西没学,但是现在不得不去复习(预习)高数,高数也难,主要是看不下去,心里心心念念的是我算法那么多东西不会,拉下来那么多,最近真的好焦虑,急躁,情绪很低落,今天看到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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值