压根没打,没时间,,,但赛后还是补了8道题
A
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
很久很久以前,有 nnn 个国家,第 iii 个国家有 aia_{i}ai 个城市,国家之间一共修建了 mmm 条双向道路,保证各个国家之间可以相互到达,正在旅行的小龙向你提出了 qqq 个问题,问你从第一个国家能到达的城市数量第 kkk 少的国家 有多少个城市,请你帮他找到答案。
输入描述:
第一行给定三个整数 n,m,qn,m,qn,m,q 分别表示国家数量,道路数量以及询问的个数。
第二行输入 nnn 个正整数第 iii 个数 aia_{i}ai 表示第 iii 个国家城市的数量。
接下来 mmm 行,每行两个正整数 u,vu,vu,v,表示 uuu 国和 vvv 国之间有一条双向道路。
接下来 qqq 行每行1个整数 kkk ,表示小龙他的问题。
保证
1≤n≤10001\leq n \leq 10001≤n≤1000
n−1≤m≤n∗(n−1)/2n-1 \leq m \leq n * (n - 1) / 2n−1≤m≤n∗(n−1)/2
1≤ai≤1000001 \leq a_{i} \leq 1000001≤ai≤100000
1≤u,v≤n1\leq u,v\leq n1≤u,v≤n
1≤k≤n1 \leq k \leq n1≤k≤n,
输出描述:
输出共qqq行,每行输出一个整数表示第iii个问题的答案。
示例1
输入
复制5 5 3 10 19 5 7 12 1 2 2 3 3 4 4 5 5 1 1 4 5
5 5 3 10 19 5 7 12 1 2 2 3 3 4 4 5 5 1 1 4 5
输出
复制5 12 19
5 12 19
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,q;
cin>>n>>m>>q;
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<m;i++)
{
int u,v;
cin>>u>>v;
}
sort(a,a+n);
for(int i=0;i<q;i++)
{
int x;
cin>>x;
cout<<a[x-1]<<endl;
}
return 0;
}
C
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
小www和大WWW为了比出谁更聪明。决定进行一场游戏。游戏内容如下:
\quad 两人轮流操作,小www先进行操作,每次操作可以选择下列两个其一:::
∙\quad \bullet∙ 选择数组中的一个数x x\ x (x!=0)x != 0)x!=0),将xxx变成x−y(1≤y≤x)x - y(1 \leq y \leq x)x−y(1≤y≤x)
∙\quad \bullet∙ 选择数组中的一个数x x\ x (x!=0x != 0x!=0),将其分成 i,j,ki ,j,ki,j,k 三个正整数 满足 i+j+k=xi + j + k =xi+j+k=x
先把数组全变为0的获胜。
请问小www是否有必胜策略。如果有输出"w win",否则输出"W win",(不带引号)。
输入描述:
第一行输入一个整数 n (1≤n≤104)n \ ( 1 \leq n \leq 10^{4})n (1≤n≤104) . 第二行输 nnn 个整数 a1 ... an (1≤ai≤100)a_{1} \ ...\ a_{n}\ (1 \leq a_{i} \leq 100)a1 ... an (1≤ai≤100) ,用空格隔开.
输出描述:
输出一个字符串"w win" 或者 "W win"。
示例1
输入
复制3 1 1 3
3 1 1 3
输出
复制w win
w win
示例2
输入
复制3 1 2 3
3 1 2 3
输出
复制W win
W win
#include <bits/stdc++.h>
using namespace std;
#define MAXN 10000 + 10
#define N 100
int SG[MAXN],S[MAXN];
vector<int> f(200,-1);
int sg(int x)
{
if (f[x] != -1)
{
return f[x];
}
set<int> S;
for (int i = 1; i <= x; i++)
{
S.insert(sg(x - i));
}
for (int i = 1; i <= x; i++)
{
for (int j = 1; j <= x; j++)
{
if (i + j < x)
{
S.insert(sg(i) ^ sg(j) ^ sg(x - i - j));
}
}
}
for (int i = 0;; i++)
{
if (!S.count(i))
{
return f[x] = i;
}
}
}
int main(){
int n;
cin>>n;
int ans=0;
while(n--)
{
int a;
cin>>a;
ans^=sg(a);
}
if (!ans)
{
cout << "W win\n";
}
else
{
cout << "w win\n";
}
return 0;
}
D
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
集训队的longlonglonglonglonglong同学刚学完c语言基础后,非常高兴的开始做题,但是突然有一题难住了longlonglonglonglonglong同学。题面如下:
ttt组输入,每组输入给两个整数aaa和bbb,输出a∗ba*ba∗b。但是a,ba,ba,b非常大,0<=a,b<=1010000000<=a,b<=10^{1000000}0<=a,b<=101000000。其中bbb的每一位都相同,且a,ba,ba,b都不含前导0。
longlonglonglonglonglong同学写不出题太痛苦了,于是请求你帮帮他。
输入描述:
第1行输入一个ttt表示ttt组输入(1<=t<=10)(1<=t<=10)(1<=t<=10)
第2到2∗t+12*t+12∗t+1行,每组给出两行,分别是a,ba,ba,b。1≤∣a∣,∣b∣≤1e61\leq|a|,|b|\leq1e61≤∣a∣,∣b∣≤1e6.
∣a∣|a|∣a∣表示aaa的长度
输出描述:
输出t行,每行一个整数,表示a∗ba*ba∗b的答案
示例1
输入
复制2 114514 22 1919810 33
2 114514 22 1919810 33
输出
复制2519308 63353730
2519308 63353730
备注:
因为整数太大不能直接用py的乘法哦,要仔细思考一下哦。
#include <iostream>
#include <cstring>
#include<algorithm>
using namespace std;void solve()
{string a, b;
string ans;
cin >> a >> b;
reverse(begin(a), end(a));
int cur = 0, temp = 0;for (int i = 0; i < a.size() + b.size(); i++)
{
if (i < a.size()) cur += a[i] - '0';
if (i >= b.size()) cur -= a[i - b.size()] - '0';
temp += cur * (b[0] - '0');
ans.push_back(temp % 10 + '0');
temp /= 10;
}
while (ans.size() > 1 && ans.back() == '0')
ans.pop_back();
reverse(begin(ans), end(ans));
cout << ans << "\n";
}int main()
{
int t;
cin >> t;
while (t--)
solve();return 0;
}
E
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
字符串的循环同构:表示把字符串的左边第一位移到最后一位,新串再进行这样的操作,得到的一些字符串都是原串的循环同构,例如"bcda"、"cdab"、"dabc"都是"abcd"的循环同构。
给你两个长度相等的字符串 aaa 和 bbb ,字符串 aaa 和 bbb 均由小写字母组成。
当某个字符 xxx 在字符串 aaa 与字符串 bbb 或 bbb 的循环同构中出现的所有位置依次对应时(对于字符串的每一位,要么 aaa 和 bbb 的这一位都是该字符,要么都不为该字符),称该字符为“好”字符。例如:当 aaa = "acba",bbb = "bdaa"时,字符'a'与字符'b'为“好”字符
现在,我们想请你判断字符串 aaa 与字符串 bbb 中“好”字符的数量
输入描述:
第一行给你一个 nnn (1≤n≤106),n(1 \leq n \leq 10^6),n(1≤n≤106),n 为字符串 aaa 与 bbb 的长度。 第二行与第三行为字符串 aaa 和 bbb ,aaa 和 bbb 均由小写字母组成。
输出描述:
单行输出一个数字,表示“好”字符的个数。
示例1
输入
复制6 acabxb eababf
6 acabxb eababf
输出
复制2
2
说明
当b的循环同构体为"ababfe"时,字符'a'为“好”字符,当b的循环同构体为"feabab"时,字符'b'为“好”字符。
示例2
输入
复制3 abc cde
3 abc cde
输出
复制1
1
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const ull P = 131, N = 1e6 + 10;
ull h1[N * 2], h2[N], p[N * 2] = {1};void geth(string &s, char c, ull *h)
{
for (int i = 1; i < s.size(); i++)
h[i] = h[i - 1] * P + (s[i] == c); //相当于将字符串s转化为01串处理
}ull get(ull *h, int l, int r)
{
return h[r] - h[l - 1] * p[r - l + 1];
}int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
string a, b;
cin >> a >> b;
set<char> st(a.begin(), a.end());
a = ' ' + a + a;
b = ' ' + b;for (int i = 1; i < N * 2; i++)
p[i] = p[i - 1] * P;int ans = 0;
for (char c : st)
{
geth(a, c, h1);
geth(b, c, h2);
for (int i = 1; i <= n; i++)
{
if (get(h1, i, i + n - 1) == get(h2, 1, n))
{
ans++;
break;
}
}
}
cout << ans;
return 0;
}
F
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
校草杜宏言和他亲爱的小学弟段辉映在玩一个取石子益智小游戏。
游戏规则如下,有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子(取走的数量都是整数)。
游戏规定,每次有两种不同的取法:
∙\quad \bullet∙ 可以在任意的一堆中取走任意多的石子;
∙\quad \bullet∙ 可以在两堆中同时取走相同数量的石子。
最后把石子全部取完者为胜者。
现在给出初始的两堆石子的数目,如果轮到杜宏言先取,假设双方都采取最好的策略,问最后谁是胜者。
输入描述:
第一行输入一个 TTT,表示有 TTT 组数据。(1≤T≤10000)(1 \leq T \leq 10000)(1≤T≤10000)。 接下来 TTT 行,其中每一行包含两个整数 aaa 和 bbb,表示两堆石子的数目,(1≤a,b≤109)(1 \leq a,b \leq 10^9)(1≤a,b≤109)。
输出描述:
输出对应也有 TTT 行,输出赢者名字每个字首字母,要求大写。例如“原神”,输出“YS”(不带引号)。
示例1
输入
复制1 2 1
1 2 1
输出
复制DHY
DHY
说明
可以发现,样例后手必胜。
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T;
cin>>T;
for(int i=0;i<T;i++)
{
long long int a,b;
cin>>a>>b;
cout<<"DHY"<<endl;}
return 0;
}
F
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
圈圈:代打王者,1r1r1r 一局,3r3r3r 两局,5r5r5r 三局,不保证胜率,诚信经营
yqyqyq :圈,我赚的第一块是小寒冰的~
静静:鸢还不给我抽到张邈!!!
狼狼:瓦,启........
玉玉:长相思长相思长相思
以上是广告招租位,和本题无关。
由于狼狼是一个喜欢看星座的小女孩,为此她写了几本备忘录来记录集训队成员的星座信息。(桃白白说过,经常看星座相关的信息可以提高 codefoecescodefoecescodefoeces 分数。多读书多看报,少吃零食多 codeforces!!!codeforces!!!codeforces!!! )
狼狼决定整理这几本备忘录里有关集训队成员的星座信息,每本备忘录都记录着一个成员的一条或多条星座信息。包含 nnn 本备忘录:每本备忘录都由一个名字 ididid 开头代表某个集训队成员名字,然后是一个记录的条目数代表狼狼在该备忘录中记录该成员的信息条数 opopop ,最后是 opopop 条星座信息本身。同一本备忘录中可能记录了多个相同的星座信息,不同的备忘录可能记录同一个人的多条信息。
狼狼认为整理这些备忘录信息应该遵循一下规则:
A:同一个成员的星座信息 xxx 是星座信息 yyy 的后缀,那么星座信息 xxx 会没有星座信息 yyy 完整,从而应该只保留星座信息 yyy ,删除星座信息 xxx 。
B:同一个成员的星座信息可能以相同格式出现多次,那么只保留该信息一次。
注意:有可能两个不同的成员有着相同的星座信息,这是合法的。
现在狼狼现在要跟圈圈静静 yqyqyq 玉玉前往瓦的训练场,请你按照规则 AAA ,规则 BBB 帮助狼狼整理她的备忘录,并且将这些备忘录信息按照字典序打印出来。
输入描述:
包含整数 n(1<=n<=20)n(1<= n <= 20)n(1<=n<=20) - 狼狼的备忘录本数 接下来的 nnn 行是按照语句中的格式对成员的星座信息进行描述。 成员名字是长度不超过10的非空字符串,他们仅由小写英文字母组成。条目数是一个不少于1,不超过10的整数。星座信息是长度不超过10的非空字符串,仅由数字组成。
输出描述:
打印有关狼狼备忘录中集训队成员们的星座信息。 第一行输出 mmm 表示在狼狼备忘录中找到的成员的数量。 以下 mmm 行必须包含以下格式:“成员名字 条目数信息 信息”,每条记录必须包含当前成员的所有星座信息。 输出时成员名字字典序小的先输出,每个成员的星座信息中字典序小的先输出,星座信息中前导零也要输出。
示例1
输入
复制3 karl 2 612 12 petr 1 12 katya 1 612
3 karl 2 612 12 petr 1 12 katya 1 612
输出
复制3 karl 1 612 katya 1 612 petr 1 12
3 karl 1 612 katya 1 612 petr 1 12
示例2
输入
复制4 ivan 3 123 123 456 ivan 2 456 456 ivan 8 789 3 23 6 56 9 89 2 dasha 2 23 789
4 ivan 3 123 123 456 ivan 2 456 456 ivan 8 789 3 23 6 56 9 89 2 dasha 2 23 789
输出
复制2 dasha 2 23 789 ivan 4 123 2 456 789
2 dasha 2 23 789 ivan 4 123 2 456 789
示例3
输入
复制2 yq 1 777777 icealsoheat 1 555
2 yq 1 777777 icealsoheat 1 555
输出
复制2 icealsoheat 1 555 yq 1 777777
2 icealsoheat 1 555 yq 1 777777
示例4
输入
复制10 zifei 1 8 zilatan 1 9 consuui 1 3 zonehawkr 1 10 wananan 1 5 foureyebird 1 4 xpp 1 7 wulong 1 6 andso 1 1 btqq 1 2
10 zifei 1 8 zilatan 1 9 consuui 1 3 zonehawkr 1 10 wananan 1 5 foureyebird 1 4 xpp 1 7 wulong 1 6 andso 1 1 btqq 1 2
输出
复制10 andso 1 1 btqq 1 2 consuui 1 3 foureyebird 1 4 wananan 1 5 wulong 1 6 xpp 1 7 zifei 1 8 zilatan 1 9 zonehawkr 1 10
10 andso 1 1 btqq 1 2 consuui 1 3 foureyebird 1 4 wananan 1 5 wulong 1 6 xpp 1 7 zifei 1 8 zilatan 1 9 zonehawkr 1 10
#include<bits/stdc++.h>
using namespace std;
bool compare(pair<string, set<string>> a, pair<string, set<string>> b) {
return a.first < b.first;
}
bool isSuffix(const string& str1, const string& str2) {
if (str1.size() > str2.size()) {
return false;
}
return equal(str1.rbegin(), str1.rend(), str2.rbegin());
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int a;
cin>>a;
map<string,set<string>>mp;
while(a--)
{
string b;
int c;
cin>>b>>c;
for(int i=0;i<c;i++)
{
string d;
cin>>d;
mp[b].insert(d);
}
}
vector<pair<string, set<string>>> ma(mp.begin(), mp.end());
sort(ma.begin(),ma.end(),compare);
cout<<ma.size()<<endl;
for(const auto& entry:ma)
{
vector<string> op;
for(const auto& str:entry.second)
{
op.push_back(str);
}
for(int i=0;i<op.size();i++)
{
string t=op[i];
for(int j=0;j<op.size();j++)
{
if(i!=j&&isSuffix(op[i], op[j]))
{
op.erase(op.begin()+i);
--i;
break;
}
}
}
cout<<entry.first<<" "<<op.size()<<" ";
for(const auto& str:op)
{
cout<<str<<" ";
}
cout<<endl;
}
return 0;
}
I
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
曾几何时,光芒万丈,一人之下,万人之上。可叹今日,zbk倒在血泊之中,兄弟联手他的未婚妻背刺了他,他的好兄弟小川夺走了属于他的一切,包括他的未婚妻。他如此爱他的未婚妻,为救他身负重伤,才给了小川可乘之机,但现在回想起来,自己也不过是一只爱情的添狗罢了。
濒死之际,恍惚中,zbk听到了一声呢喃,“如果我再给你一次机会,你又会做出怎样的抉择呢?” “你。。。你究竟是何方神圣?” "只是一直普通平凡恰恰好路过的禹longlong罢了。"
就这样在禹longlong的帮助下,zbk成功的回到了一年之前。这一世,zbk要拿回属于他的一切。但在此之前,他需要在人群中分辨出他复仇的对象是否在其中,因为zbk是个死舔狗,不忍心对未婚妻下手,因此他只需要找到小川就好了。对此,他发动了他的大编程术。
给定一个长度为n的字符串S,S全由小写字母组成,当这个字符串中存在子串“chuan”(不加引号)时,说明小川就在其中,小川可能有很多个,请输出在该字符串SSS中小川的数量。
输入描述:
1≤n≤1051 \leq n \leq 10^51≤n≤105 然后输入一个长度为n且全为小写字母组成的字符串s。
输出描述:
输出一个非负整数,表示给定字符串中的子串chuan的数量。
示例1
输入
复制5 chuan
5 chuan
输出
复制1
1
示例2
输入
复制6 chuaan
6 chuaan
输出
复制0
0
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int a;
cin>>a;
cin.ignore();
string b;
getline(cin,b);
string str="chuan";
int k=0;
while(b.find("chuan")!=-1)
{
int t=b.find("chuan");
b.replace(t,str.length(),"");
k++;
}
cout<<k<<endl;
}
J
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
毛毛看到Sakura出的计算题之后发现太难了就稍微改了一下。然后转头就让冰冰来做这道题。
题目要求冰冰得到一个 n×mn \times mn×m 的行列式。有些行列式可能无法直接计算,但可以做一个操作:在行或列补充全为 000 的一行或一列,使其变为可计算的。不过最多只能扩充成 max(n,m)×max(n,m)max(n,m) \times max(n,m)max(n,m)×max(n,m) 的行列式。要想拿满分,需计算所有可计算行列式中从 (1,1)(1,1)(1,1) 位置构成的最小值
输入描述:
第一行给出两个整数n,m。
接下来的n行,每行给出m个整数。
1≤n,m≤5,∣aij∣≤101\le n,m\le5,|a_{ij}|\le101≤n,m≤5,∣aij∣≤10
输出描述:
输出一个整数,所有构成可计算行列式的最小值。
示例1
输入
复制3 4 1 2 3 1 4 5 6 1 7 8 9 1
3 4 1 2 3 1 4 5 6 1 7 8 9 1
输出
复制-3
-3
说明
从(1,1)位置开始:
可以构成的1×11 \times 11×1行列式:[1]\begin{bmatrix} 1 \end{bmatrix}[1]=1=1=1
可以构成的2×22 \times 22×2 行列式: [1245]\begin{bmatrix} 1 & 2 \\ 4 & 5 \end{bmatrix}[1425]=−3=-3=−3
可以构成的3×33 \times 33×3 行列式:[123456789]\begin{bmatrix} 1 & 2 &3 \\ 4 & 5 &6 \\7&8&9 \end{bmatrix}⎣⎡147258369⎦⎤=0=0=0
因为n=3,m=4,所以可以按照题目,在第四行用0补全。
构成的4×44 \times 44×4 行列式: [1231456178910000]\begin{bmatrix} 1 & 2&3&1 \\ 4 & 5&6&1 \\7&8&9&1\\0&0&0&0 \end{bmatrix}⎣⎢⎢⎡1470258036901110⎦⎥⎥⎤ =0= 0=0
故所有可计算的行列式的最小值为 -3 。
备注:
简单行列式计算规则:
1.行列式只有n×nn\times nn×n的可以计算
2.n×nn \times nn×n行列式可以用以下方法计算得出: 其中NNN(j1j2...jn)\left( j_{1}j_{2}...j_{n} \right)(j1j2...jn)表示为排列(j1j2...jn)\left( j_{1}j_{2}...j_{n} \right)(j1j2...jn)的逆序对的个数
2×22 \times 22×2行列式:
对于 2×22 \times 22×2 行列式 ∣abcd∣\begin{vmatrix} a & b \\ c & d \end{vmatrix}∣∣∣∣acbd∣∣∣∣,用对角线计算方法:
左上至右下对角线乘积相加:a×da \times da×d;
右上至左下对角线乘积相减:b×cb \times cb×c;
相减后即为行列式结果:(a×d)−(b×c)(a \times d) - (b \times c)(a×d)−(b×c)。
3×33 \times 33×3 行列式:
对于 3×33 \times 33×3 行列式 ∣abcdefghi∣\begin{vmatrix} a & b & c \\ d & e & f \\ g & h & i \end{vmatrix}∣∣∣∣∣∣adgbehcfi∣∣∣∣∣∣,对角线法则展开:
沿主对角线(左上至右下)乘积求和:a×e×i+b×f×g+c×d×ha \times e \times i + b \times f \times g + c \times d \times ha×e×i+b×f×g+c×d×h;
沿副对角线(右上至左下)乘积求差:c×e×g+a×f×h+b×d×ic \times e \times g + a \times f \times h + b \times d \times ic×e×g+a×f×h+b×d×i;
对主对角线求和减去副对角线求差,即为最终结果。
#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;const int MAXN = 5;
int det(int a[MAXN][MAXN], int n) {
if (n == 1) {
return a[0][0];
}
int res = 0;
int t[MAXN][MAXN];
for (int j = 0; j < n; j++) {
int row = 0;
for (int i = 1; i < n; i++) {
int col = 0;
for (int p = 0; p < n; p++) {
if (p == j) continue;
t[row][col++] = a[i][p];
}
row++;
}
res += ((j % 2 == 1) ? -1 : 1) * a[0][j] * det(t, n - 1);
}
return res;
}int main() {
int n, m;
cin >> n >> m;int a[MAXN][MAXN] = {0};
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}int min_det = INT_MAX;
for (int size = 1; size <= max(n, m); size++) {
int submatrix[MAXN][MAXN] = {0};
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
submatrix[i][j] = a[i][j];
}
}
int current_det = det(submatrix, size);
min_det = min(min_det, current_det);
}cout << min_det << endl;
return 0;
}
补了8个题目,其他的为什么没做,问就是太难了