牛客小白月赛4 20180616C

33 篇文章 0 订阅

题目描述

铁子和顺溜上生物课的时候不小心将几滴超级病菌滴到了培养皿上,这可急坏了他们。
培养皿可以被看成一个n*n的方格,最初病菌滴在了这n*n的格子中的某些格子,病菌的传染方式是这样的,如果一个方格与两个或多个被感染的方格相邻(两个方格相邻当且仅当它们只有一条公共边),那么它就会被感染。现在铁子和顺溜想知道,最终所有的方格会不会都被感染。
输入描述:
第一行两个整数n,m。n表示方格的规格,m表示最初病菌所在的格子数。(1≤n ≤1000, 0 < m < n)。接下来m行每行两个整数xi,yi表示第xi行的第yi个格子有病菌。数据保证不会有两个病菌初始时在同一个格子。
输出描述:
如果最终所有的方格都会被感染,输出 YES。
否则输出 NO。

分析

骗分大法好,因为n≤1000,数据范围略小,所以考略暴力骗分,可根据打表得当m<n/3时,一定是不行的,所以m<n/3直接输出NO;接着是m<n/3,这时可按照时间一遍一遍的模拟,若在一轮中没有新的出现,则break,此时在扫过整个部分,若有未感染输出NO,直接return 0;最后在输出YES,时间:9ms。
上代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int al[1002][1002],n,m,k,x,y;
int main(){
    memset(al,0,sizeof(al));
    scanf("%d%d",&n,&m);
    if(m<n/3){
        printf("NO\n");
        return 0;
    }
    for(int i=1;i<=m;i++)scanf("%d%d",&x,&y);
    while(1){
        k=0;
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(!al[i][j]){
            if(al[i-1][j]+al[i+1][j]+al[i][j-1]+al[i][j+1]>=2)al[i][j]=1,k=1;
        }
        if(!k) break;
    }
    k=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(!al[i][j]){
                k=1;
                break;
            }
        }
        if(k==1) break;
    }
    if(!k) printf("YES\n");
    else printf("NO\n");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
牛客 a卷2022年第四季度的华为题目中,要求考生设计一种高效的数据结构,能够支持以下几种操作: 1. 添加一个元素 2. 删除一个元素 3. 查找是否存在某个元素 4. 返回元素的总数 该数据结构要求满足空间复杂度较小、时间复杂度较低、能够快速地进行查找和修改等多种操作。 想要编写这样一种数据结构,我们可以参考许多已有的经典算法与数据结构,如二叉树、哈希表、红黑树等,通过综合利用它们的优点来实现这个问题的解决。 例如,我们可以通过哈希表来存储所有元素的值,并在每个哈希链表的元素中再使用红黑树来进行排序与查找。这样,我们既能够轻松地进行元素的添加和删除操作,也能够在查找较大数据范围和数量时保持较高的速度与效率。同时,由于使用了多个数据结构来协同完成这个问题,我们也能够在空间复杂度上适度地进行优化。 当然,在具体设计这个数据结构的过程中,我们还需要考虑一些实践中的细节问题,例如如何避免哈希冲突、如何处理数据丢失与被删除元素所占用的空间等问题,这都需要相应的算法与流程来进行处理。 总体来看,设计这种支持多种操作的高效数据结构,需要我们具备丰富的算法知识和编程实践能力,同时需要我们在具体处理问题时能够将多种算法和数据结构进行有效地结合。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值