0
点赞
收藏
分享

微信扫一扫

2022团体程序设计天梯赛 L2题解


 

输入样例:
8 3 4
20 25 15 18 20 18 8 5
输出样例:
20 15
20 18 18 8
25 5

AC代码

#include<bits/stdc++.h>
using namespace std;

stack<int>box;
vector<int>succ;
queue<int>con;
int n,m,k,i;

void coutt()
{
    for( i =0; i<succ.size()-1; i++)
        cout<<succ[i]<<" ";
    cout<<succ[i]<<endl;
    succ.clear();
}

int main()
{
    cin>>n>>m>>k;
    int mark=0;
    while(n--)
    {
        int x;
        cin>>x;
        con.push(x);
    }
    while(!con.empty())
    {
        //小盒子已经满了,但推送器上取到的松针仍然不满足要求。此时将手中的松枝放到成品篮里,推送器上取到的松针压回推送器,开始下一根松枝的制作。
        if(!box.empty()&&!succ.empty())
            if(box.size()==m&&box.top()>succ.back()&&con.front()>succ.back())
                coutt();

        if(succ.size()==k)//手中的松枝干上已经插满了松针,将之放到成品篮里,开始下一根松枝的制作。
            coutt();

        if(succ.empty())
        {
            if(box.empty())
            {//box里面没树叶,从传送带上拿;
                succ.push_back(con.front());
                con.pop();
            }
            else
            {//box里有值,循环从box里取树叶;
                while(1)
                {
                    if(succ.size()==k)
                    {
                        coutt();break;
                    }
                    if(!succ.empty())
                    {//如果succ不为空
                        if(succ.back()>=box.top())
                        {
                            succ.push_back(box.top());
                            box.pop();

                        }
                        else//box里的不满足退出循环,从传输带上取树叶;
                            break;
                    }
                    else
                    {//如果succ为空;
                        succ.push_back(box.top());
                        box.pop();
                    }
                    if(box.size()==0)//连续从box里面取值,防止取空;
                        break;
                }
            }
        }
        else
        {//不为空的时候,不用考虑从box里取值;直接从传送带上取;
            if(succ.back()>=con.front())
            {
                succ.push_back(con.front());
                con.pop();
            }
            else
            {
                box.push(con.front());
                con.pop();
            }
        }
    }
    //小盒子中最上面的松针不满足要求,但推送器上已经没有松针了。此时将手中的松枝放到成品篮里,开始下一根松枝的制作。
    if(succ.size()>0&&!box.empty())
        coutt();
    //清空box
    while(!box.empty())
    {
        if(succ.size()==k)//手中的松枝干上已经插满了松针,将之放到成品篮里,开始下一根松枝的制作。
            coutt();
        if(succ.empty())
        {
            succ.push_back(box.top());
            box.pop();
        }
        else
        {
            if(succ.back()>=box.top())
            {
                succ.push_back(box.top());
                box.pop();
            }
            else
                coutt();
        }
    }
    //输出最后一个
    if(succ.size()>0)
        coutt();
    return 0;
}


L2-042 老板的作息表

输入样例:
8
13:00:00 - 18:00:00
00:00:00 - 01:00:05
08:00:00 - 09:00:00
07:10:59 - 08:00:00
01:00:05 - 04:30:00
06:30:00 - 07:10:58
05:30:00 - 06:30:00
18:00:00 - 19:00:00
输出样例:
04:30:00 - 05:30:00
07:10:58 - 07:10:59
09:00:00 - 13:00:00
19:00:00 - 23:59:59

AC代码

#include<bits/stdc++.h>

using namespace std;

struct in
{
    string s1,s2;
}frontt;
int n;
vector <struct in>ans;

int cmp(struct in a,struct in b)
{
    return a.s1<b.s1;
}

int main()
{
    cin>>n;
    while(n--)
    {
        cin>>frontt.s1;
        scanf(" - ");
        cin>>frontt.s2;
        ans.push_back(frontt);
    }
    sort(ans.begin(),ans.end(),cmp);

    if(ans[0].s1!="00:00:00")
        cout<<"00:00:00"<<" - "<<ans[0].s1<<endl;

    for(int k=1;k<ans.size();k++)
        if(ans[k].s1!=ans[k-1].s2)
            cout<<ans[k-1].s2<<" - "<<ans[k].s1<<endl;

    if(ans[ans.size()-1].s2!="23:59:59")
        cout<<ans[ans.size()-1].s2<<" - "<<"23:59:59"<<endl;
    return 0;
}

L2-043 龙龙送外卖

输入样例:
7 4
-1 1 1 1 2 2 3
5
6
2
4
输出样例:
2
4
4
6

AC代码

#include<bits/stdc++.h>
using namespace std;

set<int>sett;
int n,m;
int deep[100001]= {0};
int fa[100001];
int maxx;

void findd(int x)
{
    if(sett.find(x)!=sett.end())//遇到之前走过的点就不往下走了
    {
        deep[x]=deep[ fa[x] ]+1;//记录深度
        return ;
    }
    sett.insert(x);//记录经过节点数,去重
    if(fa[x]==-1)
    {
        deep[ x ]=1;
        return ;
    }
    else
    {
        findd( fa[x] );
        deep[x]=deep[ fa[x] ]+1;//回溯的时候记录深度
    }
}

int main()
{
    cin>>n>>m;
    deep[1]=1;
    for(int i=1; i<=n; i++)
    {
        int x;
        cin>>x;
        fa[i]=x;
    }
    while(m--)
    {
        int x;
        cin>>x;
        findd(x);
        maxx=max(maxx,deep[x]-1);
        cout<<(sett.size()-1)*2-maxx<<endl;
    }
    return 0;
}

L2-044 大众情人

待补……

举报

相关推荐

0 条评论