蓝桥杯赛前冲刺30天打卡题解(Day1)

一、纯质数

思路:

1.该数为质数;

2.该数由2/3/5/7组成

所以一切包含0/1/4/6/8/9的数我们都不需要额外计算

那我们先判断是质数还是由2/3/5/7组成?很明显是先判断后者

代码放下面:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n = 20210605;
    int ans = 0;
    vector<bool> isp(n+1, true);
    isp[0]=false;
    isp[1]=false;
    for (int i = 2; i <= n; i++) {
        if (isp[i]) {
            string s = to_string(i);
            if (all_of(s.begin(), s.end(), [&isp](char c) {return isp[c ^ 48]; })) {
                ans++;
            }
            long long j = (long long)i * i;
            while (j <= n) {
                isp[j] = false;
                j += i;
            }
        }
    }
    cout << ans;
    return 0;
}

二、最少砝码 

 思路:假设只有一个砝码 1     只能得到数值1
你需要获得2  并且可以获得一个更大的值
x-1=2;x=3
(因为1是可以直接用1获得的,所以放入x后
可以同时满足前面已经满足的值+新放入的值和前面所有值的差值与和值)
简单点说:假设你前面的砝码可以存放1-n,现在放入一个x
那么这些砝码可以组合出:
1-n,(x-n)---(x-1)  x---(x+n),而这一个要为连续值,则x-n=n+1
所以可以判断出
1—>1  那么下一个增加的值  x-1=1+1—>x=3
1  3—>1-(1+3)  那么下一个值  x-4=4+1—>x=9
........
x=n+n+1=2*n+1;
那么放入x后所能到达的值为  x+n=3*n+1;
代码放在下面:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
  int n;
  cin>>n;
  int ans;

  for(ans=1;;ans++)
  {
    if(pow(3,ans)-1>=2*n)break;
  }
  cout<<ans<<endl;
  return 0;
}

三、灌溉

 

 

 分析:

我们先要接收所有接收的数据,n,m是整个花园的大小。地会被分为已灌溉和未灌溉(我们把已灌溉的地赋值为1,未灌溉的赋值为0)然后会告诉你某些地方装了水管(被视为已经灌溉),(下文我称被灌溉的的地为被感染的地)初始大概的图是这样,图中的1是题目随机装水管的位置(图中的1是随机取的)。(注意此时时间还是0)

11
111111
11
1
1111
1111
1
  1. 题目说了,被灌溉的地,一秒钟会把周围上下左右都变成灌溉的状态,如果经过一秒钟以后图就变成了这样
    111111
    111111
    111111
    111
    111111
    111111
    111

  2. 每一秒钟,每个1都会把周围的0变成1。上面红色的1,就是被黑色1从0变成了1。然后下一秒钟继续如此
  3. 暴力做法:我们可以每一秒钟都从头到尾把花园遍历一遍,如果,一块地是1我就把它周围都变成1。这样下去时间复杂度肯定非常高,但这只是我们最朴素的想法。
  4. 优化做法:我注意看上图黑色的1,下一秒钟它还有用吗?没有了,因为第一秒它周围已经全部被它变成1了,第二秒再让他变一遍完全没有意义了!第二秒是上图红色的1去感染周围的地
  5. 就变成了这个样子。再下来是蓝色去继续感染,红色也变的没有用了,因为它已经将周围的感染过了。

     所以这里最核心的就是:这一秒被感染的地,下一秒去感染其他的地。我们每次记录下这一次感染的地,下次就可以自己拿这些地去感染其他的地。而不需要每次都从头到尾的去遍历花园,把这些黑色和红色的地再去重复感染一遍周围的地,没有意义。

    注意事项:在这遍历的过程中,要注意边界的问题(因为花园是有大小的)。如何实现保存这一次遍历的地呢?我们可以通过队列来接收这一秒所有被感染的地,然后下一秒把这个队列里的所有地拿去感染别人。这就是多源BFS的核心(多源的意思就是同一秒内每块地都会去感染相邻的地,这是同时发生的)。当然回到最初的问题,我们可以每次都去把花园扫一遍。

  6. 代码放在下面了

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>

using namespace std;

typedef pair<int, int> PII;

const int N = 110;

int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

queue<PII> q;
int d[N][N];
int n, m, t, k;

int bfs(){
    int res = t;
    //cout << res << endl;

    while(q.size()){
        auto t = q.front();
        q.pop();

        for(int i = 0; i < 4; i ++ ){
            int a = t.first + dx[i];
            int b = t.second + dy[i];

            if(a >= 1 && a <= n && b >= 1 && b <= m && d[a][b] == -1){
                d[a][b] = d[t.first][t.second] + 1;
                res ++ ;
                if(d[a][b] < k){
                    q.push({a, b});
                }
            }
        }
    }
    return res;
}

int main(){
    freopen("in.in", "r", stdin);

    memset(d, -1, sizeof d);

    cin >> n >> m >> t;

    int tmp = t;
    while(tmp -- ){
        int x, y;
        cin >> x >> y;
        q.push({x, y});
        d[x][y] = 0;
    }
    cin >> k;

    cout << bfs();
    return 0;
}

 

 

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一份可能的蓝桥杯赛前训练计划: 1. 熟悉考试内容和题型:了解蓝桥杯考试的内容和题型,包括编程语言、数据结构与算法、计算机基础知识和实践能力等方面的内容,并准备相关资料和练习题目。 2. 制定学习计划:根据自己的水平和时间安排,制定一份具体的学习计划,包括每天的学习目标、练习时间和计划完成时间等,以保证充分利用时间进行学习和练习。 3. 提高编程能力:进行编程练习,提高编程能力,特别是数据结构和算法的实践能力。可以参加在线编程竞赛、练习题目和刷题等方式来提高编程能力。 4. 提高计算机基础知识:学习计算机基础知识,包括计算机组成原理、操作系统、计算机网络、数据库等方面的知识,以提高程序的效率和优化能力。 5. 实践能力:进行实践练习,包括操作系统和网络配置、数据库设计和开发、Web开发等方面的实践,以提高实践能力和解决问题的能力。 6. 团队协作:参加团队协作项目,锻炼团队合作和沟通能力,同时学习项目管理和软件开发流程等相关知识。 7. 模拟考试:进行模拟考试,以检验自己的学习成果和考试准备情况,同时找出自己的弱点和不足,加以改进和提高。 8. 调整状态:保持良好的身体状态和心态,保证充足的睡眠和饮食,调整好心态,保持积极向上的心态。 以上是一份可能的蓝桥杯赛前训练计划,具体的训练计划需要根据个人情况和水平来制定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值