河南萌新联赛第三场

补了七道题

B

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

正则表达式(英语:RegularexpressionRegular expressionRegularexpression,常简写为 regexregexregex、regexpregexpregexp 或 RERERE ),又称规律表达式、正则表示式、正则表示法、规则表达式、常规表示法,是计算机科学概念,用简单字符串来描述、匹配文中全部匹配指定格式的字符串,现在很多文本编辑器都支持用正则表达式搜索、取代匹配指定格式的字符串。
许多程序设计语言都支持用正则表达式操作字符串,如Perl就内置功能强大的正则表达式引擎。正则表达式这概念最初由Unix的工具软件(例如sedsedsed 和 grepgrepgrep)普及开。
ThirdThirdThird 最近深入学习了正则表达式,现在他得到了一些数据,希望从中找出一些 IPIPIP 地址,但是 ThirdThirdThird 今天已经学习了一整天,现在他要把这个任务交给你,请你帮他完成。
但是我们都知道这是新生赛,为了让大家做的愉快,ThirdThirdThird决定只让你分析一些简单的数据。
具体来说,给你 nnn 个IPIPIP地址,每个IPIPIP为以下形式:
x.x.x.xx.x.x.xx.x.x.x,其中 xxx 表示一个十进制数字, ... 没有特殊含义,表示其本身。
你需要判断有多少数据表示的 IPIPIP 地址是正确的(正确的 IPIPIP 地址其满足以下条件:∀x∈[0,255]\forall x\in [0,255]∀x∈[0,255])。

输入描述:

第一行一个正整数 nnn,表示有 nnn 个 IPIPIP 地址。
接下来 nnn 行,每行一个 IPIPIP 地址。
数据保证 0≤x,n≤10000 \leq x,n \leq 10000≤x,n≤1000。

输出描述:

一个正整数,表示正确 IPIPIP 地址的数量。

示例1

输入

复制4 8.8.8.8 8.8.4.4 192.168.1.1 192.168.1.256

4
8.8.8.8
8.8.4.4
192.168.1.1
192.168.1.256

输出

复制3

3

示例2

输入

复制3 10.12.26.239 888.90.8.0 4.9.2.8

3
10.12.26.239
888.90.8.0
4.9.2.8

输出

复制2

2

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int t=0;
    while(n--)
    {
        int a,b,c,d;
        scanf("%d.%d.%d.%d",&a,&b,&c,&d);
        if(255>=a&&a>=0&&255>=b&&b>=0&&255>=c&&c>=0&&255>=d&&d>=0){t++;}
    }
    printf("%d",t);
    return 0;
}

C

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

一共 ttt 组询问,每组询问之间相互独立。
对于每组询问,给定一个整数 nnn,求 nnn个圆(半径可以不同)可以分割的最大区域数为多少?
 

输入描述:

第一行包含一个正整数 t(1≤t≤103)t (1\leq t \leq 10^3)t(1≤t≤103)------测试用例的数量。
接下来一行,ttt 个用空格隔开的整数 n(0≤n≤106)n(0\leq n\leq 10^6)n(0≤n≤106),依次表示每组询问给定的圆形个数。

输出描述:

一行,对于每次询问输出一个整数表示结果,每个整数之间用空格隔开。

示例1

输入

复制4 0 1 2 3

4
0 1 2 3

输出

复制1 2 4 8

1 2 4 8

 #include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        long long int b;
        cin>>b;
        if(b==0){
            cout<<1<<" ";
        }
        else{
        cout<<1+1+b*(b-1)<<" ";
        }
    }
    return 0;
}

F

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

存在一个累加器,每次可以对一个数进行加 111 操作,此时在二进制下有一些位发生改变,对一个数 xxx 进行 yyy 次累加操作,总共有多少位发生改变。

输入描述:

第一行一个正整数 TTT (1≤T≤105)(1\leq T \leq 10^5)(1≤T≤105)代表多组询问。

接下来 TTT 行 每行两个正整数 x,y(1≤x,y≤106)x,y(1\leq x,y \leq 10^6)x,y(1≤x,y≤106),代表对 xxx 进行 yyy 次累加操作。

输出描述:

TTT 行每组询问一行代表总共发生改变的位数。

示例1

输入

复制4 1 4 10 1 20 20 1 100

4
1 4
10 1
20 20
1 100

输出

复制7 1 40 197

7
1
40
197

说明

对于第一个样例开始 (0001)2(0001)_2(0001)2​ 进行 444 次累加。

第一次 (0010)2(0010)_2(0010)2​ 两位改变。

第二次 (0011)2(0011)_2(0011)2​ 一位改变。

第三次 (0100)2(0100)_2(0100)2​ 三位改变。

第四次 (0101)2(0101)_2(0101)2​ 一位改变。

备注:

#include<iostream>
using namespace std;
const int N = 2e6+10;
int f[N],c[N];
int get(int x)
{
    return c[(x&-x)];
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t; cin >> t;
    c[1]=1;
    for(int i=1;i<=20;i++)
    {
        c[1<<i]=1+i;
    }
    for(int i=1;i<=2e6;i++)
    {
        f[i]=get(i);
        f[i]+=f[i-1];
    }
    while(t--)
    {
        int x,y; cin >> x >> y;
        cout << f[x+y]-f[x] << '\n';
    }
    return 0;
}

 

H

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

小白在n×mn \times mn×m的迷宫中走路,小白从迷宫起点(1,1)(1,1)(1,1)出发,且小白仅能向下和向右走,从 (i,j)→(i+1,j)(i,j) \rightarrow (i+1,j)(i,j)→(i+1,j) 或者 从 (i,j)→(i,j+1)(i,j) \rightarrow (i,j+1)(i,j)→(i,j+1) 。 迷宫中每个方格有一个权值ai,ja_{i,j}ai,j​,小白初始拥有一个体力值hhh,每走到一个方格便会扣除该方格上的权值,如果hhh被扣除到000以下(≤0)(\leq 0)(≤0) 时 ,小白就失败了(走到终点时体力小于等于000也被认为失败)。有先见之明的小白从小黑那里偷学了一种恢复魔法,可以完全恢复在一格内消耗的权值,即在 (i,j)(i,j)(i,j) 格使用这次魔法,这个方格不再消耗血量。
然而小白并不希望依赖过多次魔法,先请你求出令小白顺利到达迷宫终点时(n,m)(n,m)(n,m),小白使用的最小魔法次数。

输入描述:

第一行有3个整数nnn,mmm (0≤n×m≤3×103)(0 \leq n \times m \leq 3 \times 10^3)(0≤n×m≤3×103),hhh (0<h≤103)(0 < h \leq 10^3)(0<h≤103) 分别表示n×mn \times mn×m大小的迷宫和小白的初始体力。
接下来nnn行每行mmm个整数。
a1,1a_{1,1}a1,1​ a1,2a_{1,2}a1,2​ a1,3a_{1,3}a1,3​ a1,...a_{1,...}a1,...​ a1,ma_{1,m}a1,m​
a2,1a_{2,1}a2,1​ a2,2a_{2,2}a2,2​ a2,3a_{2,3}a2,3​ a2,...a_{2,...}a2,...​ a2,ma_{2,m}a2,m​
...
an,1a_{n,1}an,1​ an,2a_{n,2}an,2​ an,3a_{n,3}an,3​ an,...a_{n,...}an,...​ an,ma_{n,m}an,m​
0≤aij≤10000 \leq a_{ij} \leq 10000≤aij​≤1000
初始位置 (1,1)(1,1)(1,1) 默认为 000 ,即初始位置不消耗体力。

输出描述:

输出一个整数表示小白使用的最小魔法次数

示例1

输入

复制2 3 4 0 4 6 3 5 1

2 3 4
0 4 6
3 5 1

输出

复制2

2

示例2

输入

复制4 4 5 0 2 3 4 1 2 0 1 3 4 2 2 3 4 3 4

4 4 5
0 2 3 4
1 2 0 1
3 4 2 2
3 4 3 4

输出

复制2

2

#include <bits/stdc++.h>
#define int long long 
using namespace std; 
using LL = long long; 
const int N = 3010; 
int n, m, h; 

signed main() {
    cin >> n >> m >> h; 
    
    vector<vector<int>> a(n + 1, vector<int>(m + 1, 0)); 
    vector<vector<vector<int>>> dp(n + 1, vector<vector<int>>(m + 1, vector<int>(n * m + 1, 1e18)));
    
    for(int i = 1; i <= n; ++ i ) for(int j = 1; j <= m; ++ j ) cin >> a[i][j]; 
    
    dp[1][1][0] = 0; 
    
    for(int i = 1; i <= n; ++ i ) 
        for(int j = 1; j <= m; ++ j ) {
            if(i == 1 and j == 1) continue; 
            for(int k = 0; k <= n * m; ++ k ) {
                dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j][k] + a[i][j]); 
                dp[i][j][k] = min(dp[i][j][k], dp[i][j - 1][k] + a[i][j]);
                if(!k) continue;
                dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j][k-1]); 
                dp[i][j][k] = min(dp[i][j][k], dp[i][j-1][k-1]); 
            }
        }
    
    for(int i = 0; i <= n * m; ++ i ) {
        if(dp[n][m][i] < h) {
            cout << i << endl;
            return 0; 
        }      
    }
    return 0; 
}

 

I

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

给定 nnn 个点, mmm 条边的无向图
每条边有一个花费和状态,状态为 000 表示该边处于锁定状态暂时不可通过, 111 表示可以通过
在节点 kkk 有一把钥匙,你取得钥匙后,便可以正常通过 000 状态边
现在你从 111 节点出发,需要求出到达节点 nnn 的最小花费
 

输入描述:

第一行三个整数 n,m,kn, m, kn,m,k ,分别表示节点数,边数,钥匙所在节点
接下来 mmm 行,每行四个整数 ai,bi,ci,dia_i, b_i, c_i, d_iai​,bi​,ci​,di​ ,表示 aia_iai​ 到 bib_ibi​ 之间存在一条无向边,通过该边花费 cic_ici​ ,其状态为 did_idi​ , did_idi​ 取值仅为 000 或 111

输出描述:

输出节点 111 到 nnn 的最小花费,如果无法到达,输出 −1-1−1

示例1

输入

复制6 10 5 1 2 1 1 2 4 9 1 4 5 4 1 1 3 9 1 3 6 8 0 4 6 6 0 4 5 1 0 5 6 10 0 5 6 5 0 5 6 6 1

6 10 5
1 2 1 1
2 4 9 1
4 5 4 1
1 3 9 1
3 6 8 0
4 6 6 0
4 5 1 0
5 6 10 0
5 6 5 0
5 6 6 1

输出

复制19

19

示例2

输入

复制6 10 5 1 6 4 1 6 3 9 1 3 5 8 1 1 2 10 0 3 4 2 1 4 5 2 0 3 4 5 1 3 6 6 1 5 6 1 0 3 5 10 1

6 10 5
1 6 4 1
6 3 9 1
3 5 8 1
1 2 10 0
3 4 2 1
4 5 2 0
3 4 5 1
3 6 6 1
5 6 1 0
3 5 10 1

输出

复制4

4

备注:

1≤n≤2×105,0≤m≤105,1≤k,ai,bi≤n,1≤ci≤2×1051 \le n \le 2 \times 10^5, 0 \le m \le 10^5, 1 \le k, ai, bi \le n, 1 \le ci \le 2 \times 10^51≤n≤2×105,0≤m≤105,1≤k,ai,bi≤

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5 + 5;
const ll INFF = 0x3f3f3f3f3f3f3f3f;
int n, m, k;
vector<array<int, 3>> G[N];

ll dijistra() {
    vector<ll> d(N, INFF);
    vector<bool> vis(N, 0);
    priority_queue<array<ll, 3>, vector<array<ll, 3>>, greater<array<ll, 3>>> q;
    q.push({0, 1, 0});
    d[1] = 0;
    while (q.size()) {
        auto [dist, u, has] = q.top();
        q.pop();
        if (vis[u]) continue;
        vis[u] = 1;
        if (u == k) has = 1;
        for (auto [v, w, tag] : G[u]) {
            if (tag == 0 && has == 0) continue;
            if (d[v] > dist + w) {
                d[v] = dist + w;
                q.push({d[v], v, has});
            }
        }
    }
    if (d[n] == INFF) return -1;
    else return d[n];
}
int main() {
    cin >> n >> m >> k;
    for (int i = 1; i <= m; i ++) {
        int u, v, w, tag;
        cin >> u >> v >> w >> tag;
        G[u].push_back({v, w, tag});
        G[v].push_back({u, w, tag});
    }
    cout << dijistra();
    return 0;
}

J

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

计算机视觉是一个非常有趣且充满挑战的领域。特别是卷积神经网络(CNN),这种网络在图像识别和处理方面展示了惊人的效果。keillempkill\mathtt{keillempkill}keillempkill 学姐意识到,要深入理解CNN,就必须从其最基本的组成部分------卷积操作开始。卷积操作本质上是一个元素乘积和的过程,卷积核在图像上滑动并在每个位置执行这种运算。

给定一个 n×nn \times nn×n 的卷积核和一个 m×mm \times mm×m 的矩阵。你的任务是使用卷积核对图像矩阵进行卷积操作。卷积操作是指,将卷积核覆盖到矩阵的对应部分,并将卷积核下的元素与矩阵对应位置的元素相乘,然后将所有乘积相加,得到结果矩阵的一个元素。卷积核会在整个矩阵上移动,直到覆盖矩阵的每一个可以容纳卷积核的部分。
 

例如:

输入描述:

第一行包含两个整数 nnn 和 mmm,(1≤n≤m≤20)(1 \le n \le m \le 20)(1≤n≤m≤20)
接下来 nnn 行,每行 nnn 个整数 ai,j(0≤ai,j≤20)a_{i,j} (0 \le a_{i,j} \le 20)ai,j​(0≤ai,j​≤20) ,表示卷积核。
接下来 mmm 行,每行 mmm 个整数 bi,j(0≤bi,j≤20)b_{i,j} (0 \le b_{i,j} \le 20)bi,j​(0≤bi,j​≤20) ,表示需要进行卷积的矩阵。

输出描述:

输出一个 (m−n+1)×(m−n+1)(m-n+1) \times (m-n+1)(m−n+1)×(m−n+1) 的矩阵,表示卷积操作的结果。

示例1

输入

复制2 3 0 1 2 3 1 2 3 4 5 6 7 8 9

2 3
0 1
2 3
1 2 3
4 5 6
7 8 9

输出

复制25 31 43 49

25 31
43 49

示例2

输入

复制2 4 0 1 2 3 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16

2 4
0 1
2 3
1 2 3 4
5 6 7 8
9 10 11 12
12 14 15 16

输出

复制30 36 42 54 60 66 76 84 90

30 36 42
54 60 66
76 84 90

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    vector<vector<int>> ma(n,vector<int>(n));
    vector<vector<int>> md(m,vector<int>(m));
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>ma[i][j];
        }
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>md[i][j];
        }
    }
    for(int i=0;i<=m-n;i++)
    {
        for(int j=0;j<=m-n;j++)
        {
            int k=0;
            for(int x=0;x<n;x++)
            {
                for(int y=0;y<n;y++)
                {
                    k=k+ma[x][y]*md[i+x][j+y];
                }
            }
            cout<<k<<" ";
        }
        cout<<endl;
    }
    
    return 0;
}

 

L

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

现在,你需要实现一个超级无敌简单的简化版的 SSH 服务,以验证用户的身份。

具体来说,给你 m 个密钥对,每个密钥对包含一个公钥和一个私钥
另有 n 台主机,每台主机都有一个唯一的 IPv4 地址和一定数量的用户,用户以用户名区分,同一台主机上的用户不能重名。每个用户有仅属于自己的一些公钥
然后是 q 次查询,每次查询给出一个用户名,一个 IPv4 地址以及此次登录使用的私钥,要求你判断该 IPv4 地址对应的主机上的用户,是否拥有这个私钥对应的公钥

输入描述:

第一行包含三个整数 m, n, q (1 ≤ m, q ≤ 100, 1 ≤ n ≤ 10)
接下来 m 行,每行包含两个字符串 pub, pri,表示一个密钥对,pub 是公钥,pri 是私钥,长度均不超过 10,且只包含小写字母
接下来是 n 组数据,每组数据的格式如下:
第一行包含一个字符串 ip 和 一个整数 k (1 ≤ k ≤ 10),表示一台主机的 IPv4 地址和用户数量
然后是 k 行,每行包含一个字符串 user ,一个整数 t (1 ≤ t ≤ 10) 和 t 个字符串,表示一个用户的用户名,公钥数量,以及公钥
接下来是 q 行,每行包含一个字符串 user, 一个字符串 ip 和一个字符串 pri,表示一次查询,即一个用户名,一个 IPv4 地址和一个私钥

输出描述:

对于每次查询,输出一行,如果该用户名对应的用户在该 IPv4 地址对应的主机上,并且拥有这个私钥对应的公钥,输出 Yes,否则输出 No

示例1

输入

复制3 2 2 ab cd ef gki lmn opq 1.1.1.1 2 alice 2 ab ef bob 1 ef 8.8.8.8 2 googel 1 lmn gg 3 ab ef lmn googel 8.8.8.8 opq bob 1.1.1.1 gki

3 2 2
ab cd
ef gki
lmn opq
1.1.1.1 2
alice 2 ab ef
bob 1 ef
8.8.8.8 2
googel 1 lmn
gg 3 ab ef lmn
googel 8.8.8.8 opq
bob 1.1.1.1 gki

输出

复制Yes Yes

Yes
Yes

说明

 

8.8.8.8主机上的用户googel的公钥lmn对应私钥opq,登陆成功

1.1.1.1主机上的用户bob的公钥ef对应私钥gki,登陆成功

示例2

输入

复制3 1 1 a b c d e f 127.0.0.1 1 user 1 a users 127.0.0.1 b

3 1 1
a b
c d
e f
127.0.0.1 1
user 1 a
users 127.0.0.1 b

输出

复制No

No

说明

127.0.0.1主机上并不存在users用

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int m,n,q;
    cin>>m>>n>>q;
    map<string,string> op;
    while(m--)
    {
        string a,b;
        cin>>a>>b;
        op[b]=a;
    }
    map<string,vector<string>> mp;
    map<string,vector<string>> ma;
    while(n--)
    {
        string p;
        int k;
        cin>>p>>k;
        for(int i=0;i<k;i++)
        {
            string l;int o;
            cin>>l>>o;
            mp[p].push_back(l);
            for(int j=0;j<o;j++)
            {
                string h;
                cin>>h;
                ma[l].push_back(h);
            }
        }
        
    }
    while(q--)
    {
        string user,ip,pri;
        cin>>user>>ip>>pri;
            if (find(mp[ip].begin(),mp[ip].end(),user) != mp[ip].end())
            {
                bool ked=false;
                for(auto it:ma[user])
                {
                    if(it==op[pri])
                    {
                        cout<<"Yes"<<endl;
                        ked=true;
                        break;
                    }
                }
                if(!ked){
                cout<<"No"<<endl;
            }
            }else{
                cout<<"No"<<endl;
            }   
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值