2021年CCCC天梯赛 部分题题解

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021年CCCC天梯赛 部分题题解相关的知识,希望对你有一定的参考价值。

天梯赛有三个level,第一个level基本就是语法题,第二个level是基础算法和STL库的一些应用。
第三个level就是一些难的算法。 L3的题都不是太会,有思路但是写不出来。

L1

人与神

在这里插入图片描述
https://www.acwing.com/problem/content/3459/

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(void)
{
    cout<<"To iterate is human, to recurse divine."<<endl;
    return 0;
}

两小时学完C语言

在这里插入图片描述
https://www.acwing.com/problem/content/3460/

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(void)
{
    int n,k,m; cin>>n>>k>>m;
    cout<<n-k*m<<endl;
    return 0;
}

强迫症

在这里插入图片描述
https://www.acwing.com/problem/content/3461/

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(void)
{
    string s; cin>>s;
    int year=stoi(s.substr(0,2));
    if(s.size()>4)
    {
        cout<<s.substr(0,4)<<"-"<<s.substr(4)<<endl;
        return 0;
    }
    if(year<22)
    {
        cout<<20<<s.substr(0,2)<<"-"<<s.substr(2);
    }
    else
    {
        cout<<19<<s.substr(0,2)<<"-"<<s.substr(2);
    }
    return 0;
}

降价提醒机器人

在这里插入图片描述
https://www.acwing.com/problem/content/3462/

#include<cstdio>
#include<iostream>
using namespace std;
int main(void)
{
    int n,m; cin>>n>>m;
    while(n--)
    {
        double x; cin>>x;
        if(x<m) printf("On Sale! %.1lf\\n",x);
    }
    return 0;
}

大笨钟的心情

在这里插入图片描述
https://www.acwing.com/problem/content/3463/

#include<cstdio>
#include<iostream>
using namespace std;
int a[25];
int main(void)
{
    for(int i=0;i<24;i++) cin>>a[i];
    int x;
    while(cin>>x,x>=0&&x<=23)
    {
        cout<<a[x]<<" ";
        if(a[x]>50) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
}

吉老师的回归

在这里插入图片描述
https://www.acwing.com/problem/content/description/3464/

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(void)
{
    int n,m; cin>>n>>m;
    int cnt=0;
    string ans,s;
    bool flag=false;
    getline(cin,s);
    for(int i=0;i<n;i++)
    {
        getline(cin,s);
        if(s.find("qiandao")!=-1||s.find("easy")!=-1) continue;
        cnt++;
        if(cnt==m+1)
        {
            ans=s;
            flag=true;
        }
    }
    if(flag) cout<<ans<<endl;
    else cout<<"Wo AK le"<<endl;
    return 0;
}

天梯赛的善良

在这里插入图片描述
https://www.acwing.com/problem/content/3465/

#include<cstdio>
#include<iostream>
#include<set>
using namespace std;
int main(void)
{
    multiset<int>st;
    int n,x; cin>>n;
    for(int i=0;i<n;i++) cin>>x,st.insert(x);
    auto a=st.begin();
    auto b=--st.end();
    cout<<*a<<" "<<st.count(*a)<<endl;
    cout<<*b<<" "<<st.count(*b)<<endl;
}

乘法口诀数列

在这里插入图片描述
https://www.acwing.com/problem/content/3466/

#include<cstdio>
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
stack<int> st;
int a[1005];
int main(void)
{
    int n; cin>>a[1]>>a[2]>>n;
    int k=2;
    int i=1;
    while(k<=n)
    {
        int temp=a[i]*a[i+1];
        i++;
        if(temp==0) st.push(0);//当前数就是0
        else
        while(temp)
        {
            st.push(temp%10),temp/=10;
        }
        while(st.size())
        {
            a[++k]=st.top();
            st.pop();
        }
    }
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

简单写法:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int main(void)
{
    int a,b,n; cin>>a>>b>>n;
    string s; s+=to_string(a)+to_string(b);
    int i=0;
    while(s.size()<n)
    {
       s+=to_string((s[i]-'0')*(s[i+1]-'0'));
       i++;
    }
    for(int i=0;i<n;i++)  cout<<s[i]<<" ";
    return 0;
}

L2

3464. 包装机 【队 / 栈 模拟】

在这里插入图片描述
https://www.acwing.com/problem/content/3467/

#include<cstdio>
#include<iostream>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,v;
queue<int>q[105];
stack<int>st;
vector<int>ve;//拿的
int main(void)
{
    cin>>n>>m>>v;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<m;j++)
        {
            char c; cin>>c;
            q[i].push(c);
        }
    }
    int op;
    while(cin>>op,op!=-1)
    {
        if(op==0)
        {
            if(st.size()==0) continue;//空
            int t=st.top(); st.pop();
            ve.push_back(t);
        }
        else
        {
            if(q[op].size()==0) continue;
            if(st.size()==v)//满了
            {
                int t=st.top(); st.pop();
                ve.push_back(t);
            }
            int temp=q[op].front(); q[op].pop();
            st.push(temp);
        }
    }
    for(int i=0;i<ve.size();i++) printf("%c",ve[i]);
    return 0;
}

病毒溯源 【求树的最长字典序最小的链】

在这里插入图片描述
https://www.acwing.com/problem/content/description/3468/

思路:

  • 找到入度为零的点,次点是一个根结点。
  • 遍历根节点找到字典序最小的且最长的链
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e4+10;
int h[N],e[N],ne[N],idx;
int son[N];
int st[N];
int n;

void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

int dfs(int u)
{
    int res=0;
    son[u]=-1;
    for(int i=h[u];i!=-1;i=ne[i])
    {
        int j=e[i];
        int d=dfs(j);
        if(res<d) res=d,son[u]=j;//短
        else if(res==d) son[u]=min(son[u],j);//相等,选字典序小的
    }
    return res+1;
}
int main(void)
{
    memset(h,-1,sizeof h);
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int cnt; scanf("%d",&cnt);
        for(int j=0;j<cnt;j++)
        {
            int x; scanf("%d",&x);
            add(i,x);
            st[x]=true;//记录入度
        }
    }
    
    int root=0;
    while(st[root]) root++; //找到根
    printf("%d\\n",dfs(root));
    printf("%d",root);
    while(son[root]!=-1)
    {
        root=son[root];
        printf(" %d",root);
    }
    return 0;
}

清点代码库 【map计数 / 排序】

在这里插入图片描述
https://www.acwing.com/problem/content/3469/
TLE一个点代码:

#include<cstdio>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<vector>
#include<sstream>
#include<cstring>
using namespace std;
map< vector<int>,int>mp;
vector< vector<int> > ve;
bool cmp(vector<int> a,vector<int> b)
{
    if(mp[a]==mp[b])
    {
        return a<b; 
    }
    return mp[a]>mp[b];
}
int main(void)
{
    int n,m; scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        vector<int> line;
        for(int j=0;以上是关于2021年CCCC天梯赛 部分题题解的主要内容,如果未能解决你的问题,请参考以下文章

第四届 CCCC 团体程序设计天梯赛 游记

CCCC 喊山

第四届cccc团体程序设计天梯赛

2018年 团体程序设计天梯赛——题解集

2023年团体程序设计天梯赛 题解

(每日一题)CF1139D Steps to One && 2021年天梯赛 L3-3 可怜的简单题(期望,莫比乌斯反演,杜教筛)