zoukankan      html  css  js  c++  java
  • 天天快乐编程集训队2021暑假训练-0810-数据结构题解

    1.1214 数据结构练习题――线性表操作

    对数组的相关操作
    1.insert(插入)将要插入位置后的数据后移,并将当前赋值,长度+1
    2.clear(清空),长度变为1
    3.getelem(得到当前元素),直接下标访问
    4.delete(删除),位置后的数据前移,长度-1
    5.exit(退出),做为循环结束条件

    #include <bits/stdc++.h>
    using namespace std;
    int a[1005];
    int main()
    {
        //注意本题位置从1开始,所以这里初始化为1
        int tot=1;
        string s;
        while(cin>>s,s!="exit")
        {
            if(s=="insert")
            {
                int n;
                cin>>n;
                while(n--)
                {
                    int pos,x;
                    cin>>pos>>x;
                    //倒着
                    for(int i=tot-1;i>=pos;i--)
                    {
                        //当前的挪到后面
                        a[i+1]=a[i];
                    }
                    a[pos]=x;
                    tot++;
                }
            }
            if(s=="getelem")
            {
                int pos;
                cin>>pos;
                cout<<a[pos]<<"
    ";
            }
            if(s=="clear")
            {
                //注意本题位置从1开始,所以这里初始化为1
                tot=1;
            }
            if(s=="delete")
            {
                int pos;
                cin>>pos;
                cout<<a[pos]<<"
    ";
                //正着
                for(int i=pos;i<tot;i++)
                {
                    //后一个为当前的
                    a[i]=a[i+1];
                }
                tot--;
            }
        }
        return 0;
    }
    

    2.1218 数据结构练习题――栈

    1.push(压入),把这个数字放入最后一个数后
    2.top(顶),取出top-1这个数
    3.pop(弹出),取出top-1,并把top减1
    4.清空,把top置为0

    #include <bits/stdc++.h>
    using namespace std;
    int a[1005];
    int main()
    {
        int top=0;
        string s;
        while(cin>>s,s!="exit")
        {
            if(s=="push")
            {
                int x;
                cin>>x;
                a[top++]=x;
            }
            if(s=="top")
            {
                if(top == 0) cout<<"None
    ";
                else cout<<a[top - 1]<<"
    ";
            }
            if(s=="pop")
            {
                if(top==0) cout<<"None
    ";
                else cout<<a[--top]<<"
    ";
            }
            if(s=="clear")top=0;
        }
        return 0;
    }
    

    3.5487 栈之应用

    模拟下栈操作
    出栈肯定在入栈之后,每次入栈后均判断下是否要出栈即可

    #include <bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int n;
        while(cin>>n)
        {
            string a,b;
            cin>>a>>b;
            //保存答案序列
            string ans="";
            char st[10];
            int top=0;
            //初始化,均要进栈
            for(int i=0,j=0;i<n&&j<n;i++)
            {
                //a[i]进栈
                st[top++]=a[i];
                ans+="in
    ";
                //栈有元素,去匹配
                while(top>0)
                {
                    if(b[j]==st[top-1])
                    {
                        j++,top--;
                        ans+="out
    ";
                    }
                    else break;
                }
            }
            if(top>0)cout<<"No.
    ";
            else cout<<"Yes.
    "<<ans;
            cout<<"FINISH"<<"
    ";
        }
        return 0;
    }
    

    4.4368 数据结构练习题----队列的基本操作

    1.设置队首和队尾
    2.入队,插入到最后一个元素后面
    3.出队,把队列第一个元素删除

    #include<bits/stdc++.h>
    using namespace std;
    int front,tail;
    int q[1005]; 
    int main()
    {
        string s;
        while(cin>>s)
        {
            if(s=="exit")break;
            if(s=="enq")
            {
                int x;
                cin>>x;
                q[tail++]=x;
            }
            if(s=="deq")
            {
                if(front>=tail)
                {
                    cout<<"None
    ";
                    continue;
                }
                cout<<q[front++]<<"
    ";
            }
            if(s=="printq")
            {
                if(front>=tail)
                {
                    cout<<"None
    ";
                    continue;
                }
                cout<<q[front];
                for(int i=front+1;i<tail;i++)cout<<' '<<q[i];
                cout<<"
    ";
            }
        }
        return 0;
    }
    

    5.2936 小孩报数问题

    先把n个人全放进队列,因为要指定w,所以先喊w-1个人
    喊s的出列,即喊s-1人都放到队列后面,第s个出列
    模拟这个过程即可

    #include <bits/stdc++.h>
    using namespace std;
    //s最大为150,所以要150*64
    string q[10005];
    int main()
    {
        int front=0,tail=0;
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            string s;
            cin>>s;
            q[tail++]=s;
        }
        int w,s;
        char c;
        cin>>w>>c>>s;
        for(int i=1;i<w;i++)
        {
            q[tail++]=q[front++];
        }
        while(front<tail)
        {
            for(int i=1;i<s;i++)
            {
                q[tail++]=q[front++];
            }
            cout<<q[front++]<<"
    ";
        }
        return 0;
    }
    

    6.6173 相同行程查询

    结构体勉强可以过,这里建议排序后二分

    #include<bits/stdc++.h>
    typedef long long ll;
    using namespace std;
    struct T{
        string c;
        int r;
        ll s[1005];
        int num;
    }a[105];
    int main()
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i].c>>a[i].r;
            for(int j=0;j<a[i].r;j++)cin>>a[i].s[j];
            a[i].num=0;
        }
        int k;
        cin>>k;
        while(k--)
        {
            ll id;
            cin>>id;
            for(int i=0;i<n;i++)
            {
                int flag=0;
                for(int j=0;j<a[i].r;j++)
                {
                    if(a[i].s[j]==id)
                    {
                        a[i].num+=1;
                        flag=1;
                        break;
                    }
                }
                if(flag)break;
            }
        }
        int q;
        cin>>q;
        while(q--)
        {
            string x;
            cin>>x;
            int flag1=1;
            for(int i=0;i<n;i++)
            {
                
                if(a[i].c==x)
                {
                    cout<<a[i].num<<endl;
                    flag1=0;
                }
            }
            if(flag1)cout<<"0"<<endl;
        }
        return 0;
    }
    

    二分代码

    #include <bits/stdc++.h>
    using namespace std;
    
    struct xtxc{
        string s1;
        int t;
        string s[1005];
        int num;
    }l[105];
    
    //定义一个struct数组,存储所有的人
    struct person{
        string name;
        string train;
    }p[100005];
    //写排序函数
    int cmp(person a,person b)
    {
        //按照name的字典序排列
        return a.name<b.name;
    }
    string bs(int left, int right,string x){
        int mid=(left+right)/2;
        if(p[mid].name==x)
        {
            return p[mid].train;
        }
        else if(p[mid].name<x)
        return bs(mid+1,right,x);
        else
        return bs(left,mid-1,x); 
    }
    
    int main()
    {
        ios::sync_with_stdio(false);
        //定义变量tot去保存所有的人
        int tot=0;
        int n1, n2, n3;
        cin>>n1;
        for(int i=0;i<n1;i++)
        {
            cin>>l[i].s1>>l[i].t;
            for(int j=0;j<l[i].t;j++)
            {
                cin>>l[i].s[j];
                p[tot].name = l[i].s[j];
                p[tot].train = l[i].s1;
                tot++;
            }
            l[i].num=0;
        }
        //想要二分必须先有序
        sort(p,p+tot,cmp);
        cin>>n2;
        //b和c之后并不需要,我们可以不用数组,比如直接用x
        string x;
        for(int i=0;i<n2;i++)
        {
            cin>>x;
            //先进行搜索,搜索返回下标或者train均可
            string train = bs(0,tot,x);
            //n1很小,可以直接遍历
            for(int j=0;j<n1;j++)
            {
                if(train==l[j].s1)
                {
                    l[j].num++;
                }
            }
        }
        cin>>n3;
        
        for(int i=0;i<n3;i++)
        {
            cin>>x;
            int flag=0;
            for(int j=0;j<n1;j++)
            {
                if(x==l[j].s1)
                {
                    cout<<l[j].num<<endl;
                    flag=1;
                    break;
                }
            }
            //没被标记就是没有
            if(flag==0)
            cout<<"0"<<endl;
        }
    }
    ``
    大佬您太强了,还请多多指教哎
  • 相关阅读:
    大数相加和快速相乘
    (转)直线分割平面 与 平面分割区域 问题
    8.3水了一天
    8.2数论(1)
    7.31 基本算法1.2
    7.31 基本算法1.1
    《GSoC 2019小结》&《买车小记》By Ray Guo
    【笔试题】中国电信天翼智慧家庭2020春季校园招聘
    TinyMCE主题的文章目录没法点击页内跳转
    【毕设】答辩如何准备?本科毕业论文如何撰写文献综述?
  • 原文地址:https://www.cnblogs.com/BobHuang/p/15122920.html
Copyright © 2011-2022 走看看