当前位置: 首页 > news >正文

蓝桥杯刷题冲刺 | 倒计时19天

作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺

🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾

文章目录

  • 1.抓住那头牛
  • 2.排列序数

1.抓住那头牛

  • 题目

    链接: 抓住那头牛 - C语言网 (dotcpp.com)

    题目描述

    农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000)。农夫有两种移动方式:

    输入格式

    两个整数,N和K。

    输出格式

    一个整数,农夫抓到牛所要花费的最小分钟数。

    样例输入

    5 17
    

    样例输出

    4
    
  • 第一次 AC 50%

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
    	int n,k;
    	scanf("%d%d",&n,&k);
    	
    	if(n==k)
    	{
    		printf("0");
    		return 0;
    	}
    	
    	if(n>k)
    	{
    		printf("%d",n-k);
    		return 0;
    	}
    	
    	if(n<k)
    	{
    		printf("%d",max(1+n-k,k-n));
    		return 0; 
    	}
    	
    	return 0;
     } 
    
  • 第二次 AC 50%

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
    	int n,k;
    	scanf("%d%d",&n,&k);
    	
    	if(n==k)
    	{
    		printf("0");
    		return 0;
    	}
    	
    	if(n>k)
    	{
    		printf("%d",n-k);
    		return 0;
    	}
    	
    	if(n<k)
    	{
    		int x=n,cnt=0;
    		while(x<k)
    		{
    			x*=2;
    			cnt++;
    		}
    		
    		if(cnt+k-x<0)
    		{
    			printf("%d",min(k-n,cnt+x-k));
    			return 0;
    		}
    		else
    		{
    			int c=min(k-n,cnt+x-k);
    			printf("%d",min(c,cnt+k-x));
    			return 0;
    		}
    		
    	}
    	
    	return 0;
     } 
    
  • DFS 题解

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,k;
    
    //深度搜索
    int dfs(int t) //n到t的时间 
    {
    	//不能乘车 
    	if(t<=n) 
    		return n-t;
    	
        //目标地分情况:奇数和偶数
        //为什么这么分呢?
        //偶数可以直接到,直接一步一步走那里
        //奇数:分成,到t前面往后退一步,到t后面,往前走一步
    	if(t%2==1)
    	{
    		return min(dfs(t-1)+1,dfs(t+1)+1);
    	}
    	else
    	{
    		return min(dfs(t/2)+1,t-n);
    	}
    	
    }
    
    
    int main()
    {
    	
    	cin>>n>>k;
    	
    	int s=0;
    	
    	if(n==0)  //特判一下,如果n==0,2x没有用,抓牛过程中无论如何至少会往前走一步
    	{
    		n++;
    		s++;
    	}
    	
    	s+=dfs(k);
    	
    	cout<<s<<endl;
    	
    	return 0;
     } 
    
  • 我的 low BFS

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,k;
    
    //bfs 可以走的点放进队列里面,走没走过的点,然后走到想要的结果
     
     int d[100010];
     
     bool st[100010]; 
     
    int bfs()
    {
    	queue<int> q;
    	q.push(n);
    	
    	memset(d,-1,sizeof d);
    	
    	while(q.size())
    	{
    		int t=q.front();
    		q.pop();
    		
    		//分情况 
    		if(t==k) return 0;
    		//扩展  三种情况
    		q.push(t+1);
    		q.push(t-1);
    		q.push(2*t);
    		d[t];
    	}
    	return d[k];
    	
    }
    
    int main()
    {
    	cin>>n>>k;
    	
    	cout<<bfs(); 
    	
    	return 0;
    }
    

别笑emmm,我也不知道我写的是个什么

  • 正确 BFS

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int MAXN=100001;
    struct status{
        int n,t;
        status(int n,int t)
        {
            n=n;
            t=t;
        }
    };
    bool visit[MAXN];
     
    int BFS(int n,int k){
        queue<status> myqueue;
        myqueue.push(status(n,0));//压入初始状态
        visit[n]=true; //起始点已被访问
        while(!myqueue.empty())
        {
            status current=myqueue.front();
            myqueue.pop();
            if(current.n==k)//查找成功
                return current.t;
            for(int i=0;i<3;i++)//转入不同状态 
            {
                status next(current.n,current.t+1);
                if(i==0)
                    next.n+=1;
                else if(i==1)
                    next.n-=1;
                else
                    next.n*=2;
                if(next.n<0||next.n>=MAXN||visit[next.n])
                    continue;//新状态不合法
                myqueue.push(next);//压入新的状态
                visit[next.n]=true;//该点已被访问
            } 
        }
    }
    int main()
    {
        int n,k;
        cin>>n>>k;
        memset(visit,false,sizeof(visit));//初始化;
        cout<<BFS(n,k)<<endl;
        return 0;
    }
    

    正在进一步的理解 这个BFS算法,还没有完全掌握

  • 反思

    一开始把这道题想成简单的模拟了,可以 AC 50%,还ok

    • 模拟过程中,第一次没有考虑全面

    后面又改了一次,还是不行,看题解

    真没想到,这个使用的是 dfs 和bfs ,果然做的题还是太少了

    • dfs 递归回溯
    • bfs 不断扩展 直到找到结果

2.排列序数

今天新学的知识点,跟大家分享一下,特别帅

先输入字符串 s ,然后使用 next_permutation() 输出全排列,当全排列与初始字符串相等时结束

#include<bits/stdc++.h>
using namespace std;


int main()
{
	string s="bac";
	
	sort(s.begin(),s.end());
	
	do{
		cout<<s<<endl;
	}while(next_permutation(s.begin(),s.end()));
	
	
	return 0;
}

在这里插入图片描述

s=“12345”,也是可以的

Alt

相关文章:

  • 【Linux】-- 权限和Shell运行原理
  • 个人小站折腾后记
  • 前端如何丢掉你的饭碗?
  • Spring事务和事务传播机制
  • 图片的美白与美化
  • vue的diff算法?
  • 2023年“网络安全”赛项江苏省淮安市赛题解析(超详细)
  • Python制作9行最简单音乐播放器?不,我不满足
  • chatgpt这么火?前端如何实现类似chatgpt的对话页面
  • 成本降低90%,OpenAI正式开放ChαtGΡΤ
  • 学计算机选择什么编程语言好一些?
  • 这几个过时Java技术不要再学了
  • ChatGPT是如何训练得到的?通俗讲解
  • 文心一言发布的个人看法
  • 要是早看到这篇文章,你起码少走3年弯路,20年老程序员的忠告
  • Python自动化抖音自动刷视频
  • 第十四届蓝桥杯三月真题刷题训练——第 14 天
  • ZYNQ硬件调试-------day2
  • Python的30个编程技巧
  • 中断控制器