首页 > 其他分享 >29. 书籍叠放

29. 书籍叠放

时间:2024-12-30 17:26:23浏览次数:3  
标签:num idx int 29 ++ book str 叠放 书籍

题目描述
假设书本的叠放有这样的规则,当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;
}

标签:num,idx,int,29,++,book,str,叠放,书籍
From: https://blog.csdn.net/bingw0114/article/details/143747918

相关文章

  • 大模型入门书籍 | 《大模型基础》开源分享!
    一、书籍介绍由浙江大学DAILY实验室毛玉仁研究员、高云君教授领衔撰写的《大模型基础》教材第一版。这本教材为对大语言模型感兴趣的读者系统地讲解相关基础知识、介绍前沿技术。本书包括传统语言模型、大语言模型架构、提示工程、高效参数、模型编辑、搜索增强增加生成......
  • 2024.12.29 洛谷月赛总结
    T125min推完+做完基本思路:看到这种有代价产生方式的,去思考代价如何产生,发现要么相等不用操作,要么可以直接改为2^n-1再改为t代码:#include<bits/stdc++.h>usingnamespacestd;longlongn,s,t,ans,T;intmain(){ scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&s,&t);......
  • 上周热点回顾(12.23-12.29)
    热点随笔:· 跟着8.6kStar的开源数据库,搞RAG! (削微寒)· 3款.NET开源、功能强大的通讯调试工具,效率提升利器! (追逐时光者)· 在.NETCore中使用Channel实现生产者消费者模式 (贾光辉)· 为什么推荐在.NET中使用YAML配置文件 (chester·chen)· 干掉EasyExcel......
  • 【2024-12-29】连岳摘抄
    23:59生活永远是美好的,而人的痛苦却时时发生。                                                 ——路遥高中不属于义务教育,本质上是精英选拔教育,要在其中挑选出最......
  • 2024.12.29 周日
    2024.12.29周日Q1.1100Youaregivenanumberinbinaryrepresentationconsistingofexactlynnnbits,possibly,withleadingzeroes.Forexample,for......
  • 2024.12.29
    2.Windows平台框架.NET(WPF和WinForms)MicrosoftOffice(部分组件):如Outlook的一些UI使用WPF技术。Paint.NET:一个流行的Windows平台图像编辑器,基于.NET框架。WindowsLiveWriter:博客写作工具,使用WPF构建。WindowsAPI(Win32)Notepad:Windows自带的文本编辑器,......
  • Diary - 2024.12.29
    我感觉我终于是明白了莫队二离的思想阿!!!但是是不是因为当时学数据结构的时候太摆了导致的呢?乐。到现在还是不会lct,乐乐。我突然发现我都不一定会splay???我好像只会fhq和wblt了,流泪。唉呀今天又没写题解,怎么会是呢???不行,明天必须写题解,再不写我就要报废了!!!明天必须写题解,明......
  • 2024.12.29-4 选票系统
    #include<stdio.h>#include<string.h>structXuanmin{      charname[32];   intpiao;   };intmain(){   structXuanminxm[3];   inti;   intj;   intlen;   inttotal;   chartmpname[32];   len=si......
  • 2024.12.29-3 结构体与数组
    一个案例,讲明定义用法:#include<stdio.h>#include<string.h>structStudent{      intnum;   charname[32];   intage;   charsex;   charaddr[32];   doublescore;   };intmain(){   intarr[3]={1,2,3};  ......
  • 2024.12.29-2 结构体的小应用
    例题,有两个学生,输入两个学生的信息,输入成绩高的学生信息。方法一:#include<stdio.h>#include<string.h>//定义结构体。放在mian()外,为全局变量的感觉structStudent//开头必须大写。{   intnum;   charname[32];   charsex;   intage;   ......