栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022天梯赛

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022天梯赛

L2-1 插松枝 (25 分)

人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上,做成大大小小的松枝。他们的工作流程(并不)是这样的:
每人手边有一只小盒子,初始状态为空。
每人面前有用不完的松枝干和一个推送器,每次推送一片随机型号的松针片。
工人首先捡起一根空的松枝干,从小盒子里摸出最上面的一片松针 —— 如果小盒子是空的,就从推送器上取一片松针。将这片松针插到枝干的最下面。
工人在插后面的松针时,需要保证,每一步插到一根非空松枝干上的松针片,不能比前一步插上的松针片大。如果小盒子中最上面的松针满足要求,就取之插好;否则去推送器上取一片。如果推送器上拿到的仍然不满足要求,就把拿到的这片堆放到小盒子里,继续去推送器上取下一片。注意这里假设小盒子里的松针片是按放入的顺序堆叠起来的,工人每次只能取出最上面(即最后放入)的一片。
当下列三种情况之一发生时,工人会结束手里的松枝制作,开始做下一个:
(1)小盒子已经满了,但推送器上取到的松针仍然不满足要求。此时将手中的松枝放到成品篮里,推送器上取到的松针压回推送器,开始下一根松枝的制作。
(2)小盒子中最上面的松针不满足要求,但推送器上已经没有松针了。此时将手中的松枝放到成品篮里,开始下一根松枝的制作。
(3)手中的松枝干上已经插满了松针,将之放到成品篮里,开始下一根松枝的制作。
现在给定推送器上顺序传过来的 N 片松针的大小,以及小盒子和松枝的容量,请你编写程序自动列出每根成品松枝的信息。
输入格式:
输入在第一行中给出 3 个正整数:N(≤103),为推送器上松针片的数量;M(≤20)为小盒子能存放的松针片的最大数量;K(≤5)为一根松枝干上能插的松针片的最大数量。
随后一行给出 N 个不超过 100 的正整数,为推送器上顺序推出的松针片的大小。
输出格式:
每支松枝成品的信息占一行,顺序给出自底向上每片松针的大小。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
8 3 4
20 25 15 18 20 18 8 5
输出样例:
20 15
20 18 18 8
25 5

赛后补题,比赛时卡了老半天结果只过了一个12的样例,属实亏死,数据结构的都没练过多少题,写起来还很生疏,这个代码还不知道是不是全对,之后能测试了再改过来

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int n,k,m;
vectorv[1010];
stacka;
int d[1010];
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&d[i]);
        int sum=1;

    for(int i=1;i<=n;i++)
    {
        //开一个新数组为空时的情况
        if(v[sum].size()==0&&!a.size())
        {
            v[sum].push_back(d[i]);
            if(d[i]==5)
            cout<=d[i])
        {
            v[sum].push_back(a.top());
            a.pop();
            if(v[sum][v[sum].size()-1]>=d[i])
            {
                v[sum].push_back(d[i]);
            continue;
            }
        }else if(v[sum].size()==0&&a.size()&&a.top()a.top()&&d[i]>v[sum][v[sum].size()-1]&&a.top()=k)
            {
                    sum++;
                    continue;
            }

        }else if(a.size()&&d[i]v[sum][v[sum].size()-1])//一个大于尾,一个小于尾时
        {
            v[sum].push_back(d[i]);
            if(v[sum].size()>=k)
            {
                sum++;
                continue;
            }

        }else if (a.size()&&d[i]<=v[sum][v[sum].size()-1]&&a.top()<=v[sum][v[sum].size()-1])//栈顶元素和传送带上元素都小于尾元素时
        {
            if(d[i]>a.top())
            {
                v[sum].push_back(d[i]);
            }else
            {
                v[sum].push_back(a.top());
                a.pop();
            }
            if(v[sum].size()>=k)
            {
                sum++;
                continue;
            }

        }else if(a.size()&&d[i]>v[sum][v[sum].size()-1]&&a.top()>v[sum][v[sum].size()-1])//栈顶元素和传送带上的都大于尾元素时进行下一个松枝的制作并
        {

            a.push(d[i]);
            if(a.size()&&a.size()>=m)
            {
                //i--;
                sum++;
                continue;
            }

        }else if(!a.size()&&d[i]<=v[sum][v[sum].size()-1])//栈为空时的情况1
        {
            v[sum].push_back(d[i]);
            if(v[sum].size()>=k)
                {
                    sum++;
                    continue;
                }
        }else if(!a.size()&&d[i]>v[sum][v[sum].size()-1])//栈为空时的情况2
        {
            a.push(d[i]);
            if(a.size()>=m)
            {
                sum++;
                continue;
            }
        }

    }
    //如果栈里还有元素的话需要处理
while(a.size())
{
    if(v[sum].size()!=0)
    {
        if(v[sum][v[sum].size()-1]>=a.top())
        {
            v[sum].push_back(a.top());
            if (v[sum].size()>=k)
            {
                sum++;
            }
        }else
        sum++;
    }
    if(v[sum].size()==0)
    {
    v[sum].push_back(a.top());
    if(v[sum].size()>=k)
        sum++;
    a.pop();
    }
}
//输出松枝信息
    for(int i=1;i<=sum;i++)
    {
        for(int j=0;j 
L2-2 老板的作息表 (25 分) 

 新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了?
本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。
输入格式:
输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。随后 N 行,每行给出一个时间段,格式为:
hh:mm:ss - hh:mm:ss
其中 hh、mm、ss 分别是两位数表示的小时、分钟、秒。第一个时间是开始时间,第二个是结束时间。题目保证所有时间都在一天之内(即从 00:00:00 到 23:59:59);每个区间间隔至少 1 秒;并且任意两个给出的时间区间最多只在一个端点有重合,没有区间重叠的情况。
输出格式:
按照时间顺序列出时间表中没有出现的区间,每个区间占一行,格式与输入相同。题目保证至少存在一个区间需要输出。
输入样例:
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

靠,放着这么简单的一道题不做,去做前面那个麻烦的插松枝,我真的是服了我自己了。白白的25分就这样没了。

注:直接复制输入样例粘贴会出问题,只能输入个8先然后复制7行,最后一行再单独复制就可以正常输出答案。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int n,k,m;
int d[240010];
struct nod
{
    int l,r;

}node[240000];
bool cmp(nod a,nod b)
{
    return a.l 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832444.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号