补了七道题
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;
}