第四届“传智杯”全国大学生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组)题解的主要内容,如果未能解决你的问题,请参考以下文章

第四届“传智杯”全国大学生IT技能大赛(初赛A组)

第四届“传智杯”全国大学生IT技能大赛(练习赛)完结

2021年全国职业院校技能大赛(中职组)网络安全竞赛第四套试题A模块解析(超级详细)

翻译贴上海市第八届星光计划(2019年)技能大赛网站设计(中职组)决赛题目

2021年全国行业职业技能竞赛暨第四届全国大学生大数据技能竞赛——职教学生组线上选拔赛

2022年6月第十三届蓝桥杯大赛软件赛全国决赛C++A组题解