当前位置: 首页 > article >正文

29. 书籍叠放

题目描述
假设书本的叠放有这样的规则,当A书的长度和宽度都大于B书时,可以将其B书置于A的上方,堆叠摆放,请设计一个程序,根据输入的书本长宽,计算最多可以堆叠摆放多少本书?

输入
[[16,15], [13, 12], [15, 14]]

输出
3

说明
这里代表有3本书,第1本长宽分别为16和15,第2本长宽为13和12,第3本长宽为15和14,它们可以按照 [13, 12],[15, 14],[16,15] 的顺序堆叠,所以输出3

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.假设书本的叠放有规则:当A书的长度和宽度都大于B书时,可以将其B书置于A的上方,堆叠摆放,请设计一个程序,根据输入的书本长宽,计算最多可以堆叠摆放多少本书?

2.输入:[[16,15],[13,12],[15,14]]

3.输出:3

二、解题思路

1.首先我们接收数据,char str[1000];

scanf("%s",str);

2.我们通过遍历字符串,查找字符串中‘[’的数量减去1就是我们书本的数目,使用一个变量int num = 0;存储

3.然后我们定义一个数组用来存放书本的长度和宽度,

int book[num][2];

4.将长度和宽度读取到book中

int idx = 2;

for(int i = 0; i < num; i++) {

if(str[idx] != '\0' && !isdigit(str[idx])) idx++;

int tempnum = str[idx++];

while(isdigit(str[idx])) {

tempnum = tempnum * 10 + str[idx++];

book[i][0] = tempnum;

if(str[idx] == ',') {

tempnum = str[++idx];

while(isdigit(str[idx])) {

tempnum = tempnum * 10 + str[idx++];

book[i][1] = tempnum;

}

}

5.我们对book进行排序,长和宽都小的放在前面

qsort(book, num, sizeof(book[0]), compare);

6.比较函数

int compare(const void* a, const void* b) {

int (*arr_a)[2] = (int (*)[2])a;

int (*arr_b)[2] = (int (*)[2])b;

return ((*arr_a)[0] < (*arr_b)[0]) && ((*arr_a)[1] < (*arr_b)[1]);

}

7.然后还需要遍历数组,如果遇到后面的书的长度或者宽度比前面的书短的情况我们停止

if(num == 1) {

printf("1\n");

return 0;

}

int count = 1;

for(int i = 1; i < num, i++) {

if(book[i][0] < book[i - 1][0] || book[i][1] < book[i - 1][1]) {

break;

}

count++;

}

8.最后输出结果就可以了

printf("%d\n", count);

三、具体步骤

使用的语言是C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int compare(const void* a, const void* b) {
    int (*arr_a)[2] = (int (*)[2])a;
    int (*arr_b)[2] = (int (*)[2])b;

    return (*arr_a)[1] > (*arr_b)[1] && (*arr_a)[0] > (*arr_b)[1];
}

int main() {
    char str[1000];
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';
    // printf("输入:%s\n", str);
    // 计算书本数量
    int num = 0;
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] == '[') {
            num++;
            // printf("一共%d本书\n", num);
        }
    }
    num--;  // 减去外层的大括号对应的数量
    // printf("一共%d本书\n", num);
    // 动态分配内存用于存储书本长和宽信息
    int book[num][2];

    // 使用sscanf函数解析字符串,提取书本长和宽信息并存入book数组
    int idx = 1;
    for (int i = 0; i < num; i++) {
        idx++;  // 跳过'['
        sscanf(str + idx, "%d,%d", &book[i][0], &book[i][1]);
        // 找到下一个'['的位置,更新idx
        // printf("第%d本书本的长%d宽%d\n", i, book[i][0], book[i][1]);
        while (str[idx] != '\0' && str[idx] != '[') {
            idx++;
        }
    }
    // 对书本数组进行排序
    qsort(book, num, 2 * sizeof(int), compare);
    // for (int i = 0; i < num; i++) {
    //     printf("第%d本书的长度%d宽度%d\n", i, book[i][0], book[i][1]);
    // }
    // 判断可堆叠书本数量
    int count = 1;
    if (num == 1) {
        printf("1\n");
    } else {
        for (int i = 1; i < num; i++) {
            if (book[i][0] < book[i - 1][0] || book[i][1] < book[i - 1][1]) {
                break;
            }
            count++;
        }
        printf("%d\n", count);
    }


    return 0;
}


http://www.kler.cn/a/459378.html

相关文章:

  • 矩阵简单问题(Java)
  • 加固服务器有什么用?
  • Ⅱ.INTRODUCTION TO CUDA C
  • 【MySQL基础篇】三、表结构的操作
  • 【网络】ARP表、MAC表、路由表
  • 基于51单片机和16X16LED点阵屏(74HC138和74HC595驱动)的小游戏《贪吃蛇》
  • 大模型系列——旋转位置编码和长度外推
  • Django 模型中使用 `UniqueConstraint` 实现唯一性约束
  • 碰一碰发视频后端源码技术开发详解,支持OEM
  • VectorCAST入门指导
  • vue3大屏实现;使用使用CSS Grid实现大屏
  • wxWidgets 3.2.6发布 —— 发布于2024年9月9日
  • 【机器学习】-深度学习模型
  • 计算机网络 (16)数字链路层的几个共同问题
  • node.js之---单线程异步非阻塞 I/O
  • 【C++】unordered系列关联式容器及其底层结构
  • 网络安全|如何正确识别网络钓鱼攻击?
  • 【信息系统项目管理师】第14章:项目沟通管理-基础和过程 考点梳理
  • python Celery 是一个基于分布式消息传递的异步任务队列系统
  • 物联网如何改变我们的生活:从智能家居到智慧城市
  • IEDA 使用auto Dev编码助手配置Deep Seek V3
  • Conmi的正确答案——JAVA获取远程HTTP客户端访问的IP
  • HarmonyOS Next 应用元服务开发-应用接续动态配置迁移保持迁移连续性
  • 使用 ThinkPHP 实现用户认证系统的详细教程
  • 【2024年-9月-21日-开源社区openEuler实践记录】PilotGo:简化运维管理的开源利器
  • 作业:day2