第四届“传智杯”全国大学生IT技能大赛(决赛B组)题解
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四届“传智杯”全国大学生IT技能大赛(决赛B组)题解相关的知识,希望对你有一定的参考价值。
感觉都是暴力题或者类似原题,就是手速场。
目录
A. 小智的疑惑
比赛的时候写的KMP,数组开小了wa了一下。
其实暴力就行。
#include<bits/stdc++.h>
using namespace std;
string a,b="chuanzhi";
int cnt=0;
int main(void)
cin>>a;
for(int i=0;i<a.size();i++)
int flag=a.find(b,i);
if(flag==-1) break;
else
i=flag+b.size()-1;
cnt++;
cout<<cnt;
return 0;
#include<bits/stdc++.h>
using namespace std;
string a,b="chuanzhi";
int cnt=0;
int main(void)
cin>>a;
for(int i=0;i+b.size()-1<a.size();i++)
if(a.substr(i,b.size())==b) cnt++;
cout<<cnt;
return 0;
B. 三元组
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int t,n,a[N];
int main(void)
cin>>t;
while(t--)
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int cnt=0;
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
for(int k=j;k<n;k++)
if( (i<=j) && (j<=k) && (a[i]+a[j]==a[k]) ) cnt++;
cout<<cnt<<endl;
return 0;
C. 排排队
模拟即可。
#include<bits/stdc++.h>
using namespace std;
int t,n,x;
int main(void)
cin>>t;
while(t--)
vector<int>a,b;
vector<pair<int,int>>ans;
cin>>n;
for(int i=0;i<n;i++) cin>>x,a.push_back(x);
for(int i=0;i<n;i++) cin>>x,b.push_back(x);
for(int i=0;i<n;i++)
if(a[i]!=b[i])
int j=i;
while(j<a.size()&&a[j]!=b[i]) j++;//找到第一个相等的位置
if(j<a.size())
while(j>i)//一直交换
swap(a[j-1],a[j]);
ans.push_back(j-1,j);
j--;
if(a==b)
puts("YES");
for(int i=0;i<ans.size();i++)
cout<<ans[i].first+1<<" "<<ans[i].second+1<<endl;
puts("0 0");
else puts("NO");
return 0;
D. 背单词的小智
就是二分,挺常规的。
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long int LL;
const int N=1e5*3+10;
LL a[N],n,k,sum;
bool check(LL x)
LL cnt=0,sum=0;
for(int i=1;i<=n;i++)
if(a[i]*a[i]>x) return false;
if(sum+a[i]*a[i]>x)
sum=a[i]*a[i];
cnt++;
else sum+=a[i]*a[i];
return cnt+1<=k;
int main(void)
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i]*a[i];
LL l=0,r=sum;
while(l<r)
LL mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
cout<<l;
return 0;
F1. 生活在树上(easy version)
思维题,我们这里假设1为根,就是看a,b到根结点的 dist[a]^dist[b]是不是k
注意开大点就行。
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long int ull;
const int N=1e5*5+10;
vector<pair<int,ull>>ve[N];
ull dist[N];// dist[i] i到根结点1的异或值
int n,m,st[N];
void dfs(int u,ull sum)
dist[u]=sum,st[u]=1;
for(int i=0;i<ve[u].size();i++)
ull j=ve[u][i].first,c=ve[u][i].second;
if(st[j]) continue;
dfs(j,sum^c);
int main(void)
scanf("%d%d",&n,&m);
for(int i=1;i<=n-1;i++)
ull a,b,c; scanf("%llu%llu%llu",&a,&b,&c);
ve[a].push_back(b,c),ve[b].push_back(a,c);
dfs(1,0);
while(m--)
ull a,b,k; scanf("%llu%llu%llu",&a,&b,&k);
if( (dist[a]^dist[b])==k) puts("YES");
else puts("NO");
return 0;
以上是关于第四届“传智杯”全国大学生IT技能大赛(决赛B组)题解的主要内容,如果未能解决你的问题,请参考以下文章
2021年全国职业院校技能大赛(中职组)网络安全竞赛第四套试题A模块解析(超级详细)
翻译贴上海市第八届星光计划(2019年)技能大赛网站设计(中职组)决赛题目