征服代码 2024-04-15 11:15 采纳率: 83.3%
浏览 4
已结题

求解答下程序存储问题

设有n个程序(1,2,…,n}要存放在长度为L的磁带上。程序i存放在磁带上的长度键盘输入。
程序存储问题要求确定这n个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。对于给定的n个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数。

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

int cmp(const void *a, const void *b){
    return (*(int *)a - (*(int *)b));
}
void arange(int n, int array1[], int L){
    int count = 0; // 标记存入几个程序
    for(int i = n - 1; i >= 0; i--){
        if(L >= array1[i]) count++; // 使用小于等于的条件判断
        L -= array1[i];
    }
    printf("%d", count);
}
int main(){
    int n = 0, L = 0;
    scanf("%d %d", &n, &L);
    int array[n];
    for(int i = 0; i < n; i++){
        scanf("%d", &array[i]);
    }
    qsort(array, n, sizeof(int), cmp); // 使用qsort对array进行从小到大排序
    arange(n, array, L);

    return 0;
}

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

int cmp(const void *a, const void *b){
    return (*(int *)a - (*(int *)b));
}

void arange(int n, int array1[], int L){
    int count = 0; // 标记存入几个程序
    int *ptr = array1 + n - 1; // 指向数组最后一个元素
    while (ptr >= array1 && L > 0) {
        if (*ptr <= L) { // 如果当前程序长度小于等于剩余空间
            count++; // 存入当前程序
            L -= *ptr; // 更新剩余空间
        }
        ptr--; // 移动指针到下一个程序
    }
    printf("%d", count);
}

int main(){
    int n = 0, L = 0;
    scanf("%d %d", &n, &L);
    int array[n];
    for(int i = 0; i < n; i++){
        scanf("%d", &array[i]);
    }
    qsort(array, n, sizeof(int), cmp); // 使用qsort对array进行从小到大排序
    arange(n, array, L);

    return 0;
}

为什么第一个代码错误第二个代码正确,我猜是存储的问题,但是我不理解这些常量和数组在内存中是如何存放和读取调用的,求解答。

  • 写回答

6条回答 默认 最新

  • 源代码大师 博客专家认证 2024-04-15 11:18
    关注

    你的程序的基本思路是正确的,即通过对程序长度进行排序,然后从最短的程序开始尝试放入磁带中,这样可以确保存储尽可能多的程序。但是,你在arange函数中对磁带长度L的处理有误。你应该在确认一个程序可以被存储后,才从L中减去该程序的长度。此外,你的循环是从数组的末尾开始向前遍历的,这实际上是尝试先存放长度较大的程序,这与问题的要求相悖。

    下面是修改后的代码,修正了这些问题,并且从数组的开始处遍历,优先考虑长度较短的程序:

    c
    #include<stdio.h>
    #include<stdlib.h>
    
    int cmp(const void *a, const void *b){
        return (*(int *)a - (*(int *)b));
    }
    
    void arange(int n, int array[], int L){
        int count = 0; // 标记存入几个程序
        for(int i = 0; i < n; i++){
            if(L >= array[i]){ // 如果剩余长度足够存储当前程序
                count++; // 程序数加一
                L -= array[i]; // 更新剩余长度
            } else {
                break; // 剩余长度不足以存储当前程序,结束循环
            }
        }
        printf("%d\n", count);
    }
    
    int main(){
        int n = 0, L = 0;
        scanf("%d %d", &n, &L);
        int array[n];
        for(int i = 0; i < n; i++){
            scanf("%d", &array[i]);
        }
        qsort(array, n, sizeof(int), cmp); // 使用qsort对array进行从小到大排序
        arange(n, array, L);
    
        return 0;
    }
    
    
    
    

    这样修改后,程序首先将所有程序按长度从小到大排序,然后从最短的程序开始尝试存放,直到磁带上的剩余长度不足以存储下一个程序为止。这种方法更符合题目的要求,可以确保在磁带上存储尽可能多的程序。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月22日
  • 已采纳回答 4月15日
  • 创建了问题 4月15日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?