蓝桥杯刷题第二十五天

这篇具有很好参考价值的文章主要介绍了蓝桥杯刷题第二十五天。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一题:全球变暖

题目描述

你有一张某海域 NxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示:

.......

.##....

.##....

....##.

..####.

...###.

.......

其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

.......

.......

.......

.......

....#..

.......

.......

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

输入描述

第一行包含一个整数 N (1≤N≤1000)。

以下 N 行 N 列代表一张海域照片。

照片保证第 1 行、第 1 列的像素都是海洋。、

输出一个整数表示答案。

输入输出样例

示例

输入

7
.......
.##....
.##....
....##.
..####.
...###.
.......

输出

1

 dfs,岛屿问题

一个岛屿不会被淹没,要有一块大陆上下左右都不和海洋相邻

flag表示一个岛屿中有一块大陆是这样的,就不需要再遍历了

其余情况继续遍历,并且把对应变成海洋,这里用*来代替,就不用开状态数组了

#include<iostream>
#include<queue>
using namespace std;

const int N = 1010;
char g[N][N];
int n, cnt, olds, news;
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
bool flag;

void dfs(int u, int v){
  if(!flag) {
    cnt = 0;
    for(int i = 0; i < 4; i++){
      int x = dx[i] + u, y = dy[i] + v;
      if(g[x][y] != '.') cnt++;
    }
    if(cnt == 4) {
      news++;
      flag = true;
    }
  }

  g[u][v] = '*';
  for(int i = 0; i < 4; i++){
    int x = dx[i] + u, y = dy[i] + v;
    if(x >= 1 && x <= n && y >= 1 && y <= n && g[x][y] == '#')
      dfs(x, y);
  }

}

int main(){
  cin>>n;

  for(int i = 1; i <= n; i++)
    for(int j = 1; j <= n; j++)
      cin>>g[i][j];

  for(int i = 1; i <= n; i++)
    for(int j = 1; j <= n; j++)
      if(g[i][j] == '#'){
        olds++;
        flag = false;
        dfs(i ,j);
      }

  cout<<olds-news<<endl;
  return 0;
}

 新的方法,叫什么弗拉基米得算法,通过这可以遍历到每个连通块中的各个陆地

首先遍历,如果当前没有被遍历,而且为陆地,比较边界数量和总数量得值,如果相等,即要被淹没,所以就要加进去

然后是一个BFS,使用stl队列实现,如果该陆地相邻有海洋,那么他就是边界

是陆地而且没有遍历过的话,就放进队列再找

#include<iostream>
#include<queue>
using namespace std;

const int N = 1010;
char g[N][N];
bool st[N][N];
int n;
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};

void dfs(int ax,int ay, int& total, int& bound){
    queue<pair<int, int>> q;
    q.push({ax, ay});
    st[ax][ay] = true;
    
    while(q.size()){
        auto t = q.front();
        q.pop();
        total++;
        bool is_bound = false;
        
        for(int i = 0; i < 4; i++){
            int x = t.first + dx[i], y = t.second + dy[i];
            if(x < 1 || x > n && y < 1 || y > n ) continue;
            if(st[x][y]) continue;
            if(g[x][y] == '.'){
                is_bound = true;
                continue;
            }
            q.push({x, y});
            st[x][y] = true;
        }
        if(is_bound) bound++;
    }
    
}

int main(){
  cin>>n;

  for(int i = 1; i <= n; i++)
    for(int j = 1; j <= n; j++)
      cin>>g[i][j];

  int cnt = 0;
  for(int i = 1; i <= n; i++)
    for(int j = 1; j <= n; j++)
        if(!st[i][j] && g[i][j] == '#'){
            int total = 0, bound = 0;
            dfs(i ,j ,total, bound);
            if(total == bound)
                cnt++;
        }
    
  cout<<cnt<<endl;  
  return 0;
}

第四题:搬砖

问题描述

这天,小明在搬砖。

他一共有 n 块砖, 他发现第 i 砖的重量为 wi​, 价值为 vi​ 。他突然想从这些 砖中选一些出来从下到上堆成一座塔, 并且对于塔中的每一块砖来说, 它上面 所有砖的重量和不能超过它自身的价值。

他想知道这样堆成的塔的总价值(即塔中所有砖块的价值和)最大是多少。

输入格式

输入共 n+1 行, 第一行为一个正整数 n, 表示砖块的数量。

后面 n 行, 每行两个正整数 wi​,vi​ 分别表示每块砖的重量和价值。

输出格式

一行, 一个整数表示答案

样例说明

选择第 1、2、4块砖, 从上到下按照 2、1、4 的顺序堆成一座塔, 总价值 为 4+1+5=10

评测用例规模与约定

对于 20% 的数据, 保证 0n≤10;

对于 100% 的数据, 保证 n≤1000;wi​≤20;vi​≤20000 。

样例输入

5
4 4
1 1
5 2
5 5
4 3

样例输出

10

明确排序指标很关键,这是数学,要推导和多做题

然后剩下就是01背包问题了,直接套模板

j <= 2000 因为题目范围文章来源地址https://www.toymoban.com/news/detail-407744.html

#include<iostream>
#include<algorithm>
using namespace std;

typedef pair<int, int> PII;
const int N = 1010;
PII a[N];
int n, f[20004];

bool cmp(PII x, PII y){
  return x.first + x.second < y.first + y.second;
}

int main(){
  cin>>n;

  for(int i = 0; i < n ; i++){
    int w, v;
    cin>>w>>v;
    a[i] = {w, v};
  }

  sort(a, a + n, cmp);
  for(int i = 0; i < n; i++){
    int w = a[i].first, v = a[i].second;
    for(int j = 20000; j >= w; j--)
      if(v >= j - w) f[j] = max(f[j], f[j - w] + v);
  }
  
  int maxv = 0;
  for(int i = 0; i <= 20000; i++) maxv = max(maxv, f[i]);

  cout<<maxv<<endl;
  return 0;
}

到了这里,关于蓝桥杯刷题第二十五天的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯刷题014——求阶乘(二分法)

    蓝桥杯2022省赛题目 问题描述 满足 N ! 的末尾恰好有  K 个 0 的最小的 N 是多少? 如果这样的 N 不存在输出 −1 。 输入格式 一个整数 K 。 输出格式 一个整数代表答案。 样例输入 样例输出 评测用例规模与约定 对于 30% 的数据, 1≤K≤10^6. 对于 100% 的数据, 1≤K≤10^

    2023年04月12日
    浏览(26)
  • 蓝桥杯刷题015——最少刷题数(二分法+前缀和)

    问题描述 小蓝老师教的编程课有  N 名学生 , 编号依次是 1…N  。 第 i 号学生这学期刷题的数量是 Ai​  。 对于每一名学生, 请你计算他 至少 还要再刷多少道题 , 才能使得 全班刷题比他多的学生数不超过刷题比他少的学生数。 输入格式 第一行包含一个正整数 N 。 第二

    2023年04月14日
    浏览(30)
  • 蓝桥杯刷题冲刺 | 倒计时3天

    作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 题目 链接: 790. 数的三次方根 - AcWing题库 给定一个浮点数 n,求它的三次方根。 输入格式 共一行,包含一个浮点数 n。 输出格式 共一行,包含一个浮点数,表示问

    2023年04月09日
    浏览(35)
  • 蓝桥杯刷题冲刺 | 倒计时2天

    作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 题目 链接: 854. Floyd求最短路 - AcWing题库 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,边权可能为负数。 再给定 k 个询问,每个询问包含两个整数

    2023年04月10日
    浏览(33)
  • 蓝桥杯刷题冲刺 | 倒计时1天

    作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾蓝桥杯加油,大家一定可以🐾 我是菜菜,最近容易我犯的错误总结 + 一些tips 各位蓝桥杯加油加油 当输入输出数据不超过 1e6 时, scanf printf 和 cin cout 是没有差距的; 超过这个数据范围时,就是用 scanf printf 多次调式,自己手

    2023年04月09日
    浏览(28)
  • 蓝桥杯刷题冲刺 | 倒计时6天

    作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 题目 链接: 4941. 凑数 - AcWing题库 初始时,n=0。 每一轮操作都要依次完成两个步骤: 第一步,任选一个 非负 整数 a,将 n 增加 a,这一步所需付出的代价为 a。 第二

    2023年04月08日
    浏览(33)
  • 蓝桥杯刷题016——最大子矩阵(尺取法+单调队列)

    题目来源:最大子矩阵 - 蓝桥云课 (lanqiao.cn) 问题描述 小明有一个大小为 N×M 的矩阵, 可以理解为一个 N 行 M 列的二维数组。 我们定义一个矩阵 m 的 稳定度 f(m)  为 f(m)=max(m)−min(m) , 其中 max(m) 表示矩阵 m 中的最大值, min(m) 表示矩阵 m 中的最小值。 现在小明想要从

    2023年04月16日
    浏览(27)
  • 【蓝桥杯刷题冲刺辅导】掌握递归·DFS解题套路,这一文足以?

    大家好,我是安然无虞。 目录 一、刷题前和铁汁们唠一唠 1.刷题前须知 2.刷题时套路 1套路 2背下列常用数 ​ 3投机取巧:根据数据范围确定算法 ​ 4珍惜每分每秒 · 直接复制粘贴  5输入输出函数的使用 二、刷题强化 例一:递归实现指数型枚举 例二:递归实现排列型枚举

    2023年04月10日
    浏览(28)
  • 2023-5-25第二十五天

    attach附上 attack攻击 vargay奇特,好奇 fold折叠,合拢,包住 suspect怀疑 respect尊敬 costume服装 implement实施,执行,使生效 distract使分心 distric区 separate abortion流产 abortive失败的 amount convent修女 conventional普通的,常规的 convene召开,召集 wise明智的,高明的,精通的 possible

    2024年02月07日
    浏览(31)
  • 【C++刷题】经典简单题第二辑

    回文排列 URL化 配对交换 递归乘法 阶乘尾数 二进制链表转整数 从链表中删去总和值为零的连续节点 括号的最大嵌套深度 整理字符串 奇偶树 将句子排序 最长和谐子序列

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包