天天快乐编程集训队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]<<"\n";
        }
        if(s=="clear")
        {
            //注意本题位置从1开始,所以这里初始化为1
            tot=1;
        }
        if(s=="delete")
        {
            int pos;
            cin>>pos;
            cout<<a[pos]<<"\n";
            //正着
            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\n";
            else cout<<a[top - 1]<<"\n";
        }
        if(s=="pop")
        {
            if(top==0) cout<<"None\n";
            else cout<<a[--top]<<"\n";
        }
        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\n";
            //栈有元素,去匹配
            while(top>0)
            {
                if(b[j]==st[top-1])
                {
                    j++,top--;
                    ans+="out\n";
                }
                else break;
            }
        }
        if(top>0)cout<<"No.\n";
        else cout<<"Yes.\n"<<ans;
        cout<<"FINISH"<<"\n";
    }
    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\n";
                continue;
            }
            cout<<q[front++]<<"\n";
        }
        if(s=="printq")
        {
            if(front>=tail)
            {
                cout<<"None\n";
                continue;
            }
            cout<<q[front];
            for(int i=front+1;i<tail;i++)cout<<' '<<q[i];
            cout<<"\n";
        }
    }
    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++]<<"\n";
    }
    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;
    }
}
``
posted @ 2021-08-10 11:32  暴力都不会的蒟蒻  阅读(94)  评论(0编辑  收藏  举报