2-9 彩虹瓶 (20 分)

彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里。

假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将顺序就编号为 1 到 N)。现在工厂里有每种颜色的小球各一箱,工人需要一箱一箱地将小球从工厂里搬到装填场地。如果搬来的这箱小球正好是可以装填的颜色,就直接拆箱装填;如果不是,就把箱子先码放在一个临时货架上,码放的方法就是一箱一箱堆上去。当一种颜色装填完以后,先看看货架顶端的一箱是不是下一个要装填的颜色,如果是就取下来装填,否则去工厂里再搬一箱过来。

如果工厂里发货的顺序比较好,工人就可以顺利地完成装填。例如要按顺序装填 7 种颜色,工厂按照 7、6、1、3、2、5、4 这个顺序发货,则工人先拿到 7、6 两种不能装填的颜色,将其按照 7 在下、6 在上的顺序堆在货架上;拿到 1 时可以直接装填;拿到 3 时又得临时码放在 6 号颜色箱上;拿到 2 时可以直接装填;随后从货架顶取下 3 进行装填;然后拿到 5,临时码放到 6 上面;最后取了 4 号颜色直接装填;剩下的工作就是顺序从货架上取下 5、6、7 依次装填。

但如果工厂按照 3、1、5、4、2、6、7 这个顺序发货,工人就必须要愤怒地折腾货架了,因为装填完 2 号颜色以后,不把货架上的多个箱子搬下来就拿不到 3 号箱,就不可能顺利完成任务。

另外,货架的容量有限,如果要堆积的货物超过容量,工人也没办法顺利完成任务。例如工厂按照 7、6、5、4、3、2、1 这个顺序发货,如果货架够高,能码放 6 只箱子,那还是可以顺利完工的;但如果货架只能码放 5 只箱子,工人就又要愤怒了……

本题就请你判断一下,工厂的发货顺序能否让工人顺利完成任务。

输入格式:

输入首先在第一行给出 3 个正整数,分别是彩虹瓶的颜色数量 N(1<N≤103)、临时货架的容量 M(<N)、以及需要判断的发货顺序的数量 K。

随后 K 行,每行给出 N 个数字,是 1 到N 的一个排列,对应工厂的发货顺序。

一行中的数字都以空格分隔。

输出格式:

对每个发货顺序,如果工人可以愉快完工,就在一行中输出 YES;否则输出 NO

输入样例:

7 5 3
7 6 1 3 2 5 4
3 1 5 4 2 6 7
7 6 5 4 3 2 1

结尾无空行

输出样例:

YES
NO
NO

结尾无空行

我的代码:

#include <stdio.h>
#include<string.h>
/*
按照一定的顺序
思路:将货物按发货顺序取出,若符合正确顺序,拆箱,否则堆在栈顶,
*/
struct Stack{
int *data;
int top;
};int main(){int N,M,K;//颜色数,货架容量,列举数scanf("%d %d %d",&N,&M,&K);int i=0,j=0;int seq[K][N];for (i=0;i<K;i++){for(j=0;j<N;j++){
scanf("%d",&seq[i][j]);}}for(i=0;i<K;i++)
judge(seq[i],N,M);return 0;
}void judge(int a[],int size,int cap){int  i=0;//记录标准输出顺序int standard[size];for(i=0;i<size;i++){standard[i]=i+1;}
//初始化临时栈
struct Stack* stack=(struct Stack*)malloc(sizeof(struct Stack));
stack->top=-1;
stack->data=(int *)malloc(cap*sizeof(int ));
int j=0;
//将货物全部取出,将可以放的放下,不能放的压入栈中
for(i=0;i<size;i++)
{//出货货物符合当前顺序,拆箱
if(a[i]==standard[j]) {//printf("%d=%d,out\n",a[i],standard[j]);j++;continue;}
else {
//若栈中有正确的数,出栈while(stack->top!=-1&&stack->data[stack->top]==standard[j]){//printf("%d=%d,%d出栈\n",stack->data[stack->top],standard[j],stack->data[stack->top]);j++;stack->top--;}}
//入栈//判断是否满栈if(IsFull(stack,cap)) {//printf("栈满 ");printf("NO\n");return 0;}else{//printf("%d入栈\n",a[i]);stack->top++;stack->data[stack->top]=a[i];}}//printf("出栈前standard值为:%d\n",standard[j]);
//将剩下的栈中的元素放下
while(stack->top!=-1){if(stack->data[stack->top]==standard[j]){//printf("%d=%d,%d出栈\n",stack->data[stack->top],standard[j],stack->data[stack->top]);j++;stack->top--;}else{//printf("出栈错误  NO\n");printf("NO\n");return 0;}
}
printf("YES\n");
return 0;
}
//判断满栈
int IsFull(struct Stack *s,int cap){
if(s->top+1==cap){//printf("满栈\n");return 1;
}else {//printf("栈中剩下%d个位置",cap-(s->top+1));return 0;
}
}

PTA 2-9 彩虹瓶 (20 分)(C语言)相关推荐

  1. 2-9 彩虹瓶 (20 分)

    2-9 彩虹瓶 (20 分) rb.JPG 彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里. 假设彩虹瓶里要按顺序装 N 种颜色 ...

  2. 2-9 彩虹瓶 (20 分)

    2-9 彩虹瓶 (20 分) 彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里. 假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将 ...

  3. 天梯赛PTA L1-059 敲笨钟 (20 分)C语言解法

    微博上有个自称"大笨钟V"的家伙,每天敲钟催促码农们爱惜身体早点睡觉.为了增加敲钟的趣味性,还会糟改几句古诗词.其糟改的方法为:去网上搜寻压"ong"韵的古诗词 ...

  4. PTA 天梯赛的善良(20分)[C语言]

    很多人只能拿18分,会掉两个测试点,因为题没读明白,当最大最小值相同时要一起输出,所以这是一道"循环+多分支"的题,循环很简单,但想拿满分多分支的情况,一定要想清楚. #inclu ...

  5. 天梯赛 L2-032 彩虹瓶 (25 分)

    L2-032 彩虹瓶 (25 分) 思路: 读完题目就知道是用栈处理, 值得注意的是 1 while (s.size() && s.top() == d)中,要先判断栈的大小,再判断栈 ...

  6. 一起开心2020蓝桥寒假训练(二)7-6 彩虹瓶 (25分)用到栈,队列

    一起开心2020蓝桥寒假训练(二)7-6 彩虹瓶 (25分) 彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里. 假设彩虹瓶里要按 ...

  7. PTA 7-9 叶节点求和 (20 分)

    PTA 7-9 叶节点求和 (20 分) 对给定的有N个节点(N>=0)的二叉树,求叶节点元素之和 没有当过父节点的节点都是叶子节点 #include <iostream> #inc ...

  8. L2-032 彩虹瓶 (25分)(C语言)

    L2-032 彩虹瓶 (25分) 彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里. 假设彩虹瓶里要按顺序装 N 种颜色的小球(不 ...

  9. L1-049 天梯赛座位分配 (20分)(C语言)

    L1-049 天梯赛座位分配 (20分)(C语言) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛 ...

最新文章

  1. SSIS中的记录集目标
  2. 【数据分析】多场景下的算法构建
  3. 你认识它们吗?2014十大科技流行词
  4. easyUI的图标设置
  5. CentOS7下安装pssh并使用
  6. opencv yuv保存本地_OpenCV-dlib-python3实现人脸戴墨镜和含Y的抖音效果
  7. Linux下查看物理CPU、逻辑CPU和CPU核数
  8. Python学习之路day3-集合
  9. 树莓派3B 开启串口
  10. python安装包下载及安装(超详细)
  11. FPGA入门到精通系列1:数字电路基础知识
  12. CS 61A Environment Diagrams 学习笔记
  13. 千万级敏感词过滤设计
  14. 网络机顶盒固件提取、编辑和打包
  15. 子域名在线查询网站推荐
  16. 成长的路上每一步都需要自己去用心体会!
  17. 一个题目引发的数组和指针复习
  18. 如何无痕在线去水印,水印云一键去除法
  19. 【Qt编程】基于QWT的曲线绘制及图例显示操作
  20. HDMI 数据包简析

热门文章

  1. 【PHP小皮】下载高版本php8.1.0
  2. 九城全资子公司NBTC Limited与链游平台DPK正式签署投资协议
  3. 构建系统安全防线!Genmai安全漏洞检测框架全面解析
  4. ssd windows未能启动服务器,固态硬盘消失不能启动。试修复。
  5. 室内定位下的智能养老看护系统追踪报警解决方案--室内定位--新导智能
  6. ipv6的127位掩码如何表示_电脑网络:IP地址、子网掩码详解-你们好,做个朋友可好...
  7. 解决微云下载限速问题
  8. php h5支付没有返回app中,很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法...
  9. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十二(下单和微信支付)
  10. 数学口袋精灵感受与BUG