Q5_装箱问题 专注,认真,思考,坚持,不放弃

本文分享了解决编程题目的过程及心得,强调独立思考的重要性,并通过对比个人代码与参考代码,提炼出提升编程能力的有效途径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题在百炼上的编号是1017

上次Q4提交给师兄后,师兄给出的点评,粘贴到这里,在以后的做题中时刻提醒自己:

我发现你做题时现在存在几个问题
1.参考标准答案过多,要尽量争取自己打出来,这是这些题都是常规题,只是你的计算机思维锻炼的还比较少,而这种思维是后面项目编程所必需的。
2.如果实在答不出来了,可以看看标准答案,但是不要看标准程序。只能看“解题思路”,绝对不能看“参考程序”。从解题思维那里学到了如何解决问题,但“如何实现”也是一个需要锻炼的能力。  “参考程序”在你没有"Accept"之前,是决不允许看的!
3.写一写程序,然后再看看计算机算法与数据结构类似的书,对提高编程思维有好处。这些书也不着急一定看完,但是一定要坚持看,坚持看一本就足够了。

我原来也像你一样用功,但是发现学的并不好,后来我才知道原因:“身体的勤奋不是真正的勤奋,而是头脑上的勤奋。身体上再勤奋,却不思考,只知道蛮干,也算是一种懒惰”


今天这道题是从早晨做到了现在,但却感觉收获很大:

首先,让我知道,任何问题,只要经过努力的思考,总会解决的。

开始的时候想的很简单,很快的写出了一个版本,提交后Runtime error,我猜测是自己定义的数组太大了,就将输入改为动态内存分配,这次没有错,但是Wrong Answer了,静下心来仔细想了下,不可能那么简单,于是就在纸上分析,想到上次提交Q4给师兄的时候,师兄说这些都是写常规的题目,尽量不要看解题思路和答案。我就想一定不能看参考,既然是常规题,认真想肯定会想出来了,用笔在纸上画画真的画出了一种方案,我赶紧将它用程序实现,提交了几次都是Wrong Answer。在提交的过程中,总看见有人Accepted了,就有点小着急,坚持自己的程序,没有发现什么错误。后来ask了师兄,师兄说

在这种情况下,首先是看看文档中的解题思路,看看思路有没有问题。
如果思路没有问题,然后提交几次都出bug,那么要不然找人帮忙看看代码,要不然就可以看看参考程序。
其实参考程序是在你充分思考,反复写代码、调试并提交之后,看的效果最好
对比对比程序,找找问题,看看哪块没有考虑清楚。
这些题的解答结果不重要,重要的是这一套思考问题,用程序解决问题的过程。其实每一道题都可以算作是一个小的项目,都是一个锻炼的过程。每次靠自己的能力做完题目,就类似于靠自己一点点努力完成一个项目或布置得任务。 
解决这些题的过程和在公司完成任务的过程类似,所以如果做题做得多的话,在面试时是很占优势的。
就算到了单位,也能很好的完成任务安排。
如果做题这个习惯能坚持到你毕业,那么你就和大牛离得不远了

 听了师兄说的,我看了参考的思路分析,看了几句话后就很开心,因为和我之前自己的分析相吻合,这不就是我前几天说的,什么时候我也能一下子就想到这种方法呢,这次虽然不是一下子,但是也是自己想出来的,表扬自己鼓励一下~,那我思路没错,那错在了哪里,再往下看,啊。。好粗心我,竟然在统计剩余的1*1空间处出现遗漏。治学要严谨,coding要细心。知道了自己错在了哪里,就有信心了,很快的补上了遗漏的情况,提交Accepted。

我的code和参考给出的code还有一些差别,在这里都粘贴上来,比较,选择最优,在以后的编程中notice:

my:

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

int main()
{
    int order[6];
    int i,j,total;

    //动态分配内存
    int *p;
    p=(int *)malloc(sizeof(int));

    //输入订单的数目
    for(j=0;;j++){
        scanf("%d%d%d%d%d%d",&order[0],&order[1],&order[2],&order[3],&order[4],&order[5]);

        total=0;
        total=total+order[5]+order[4]+order[3];//处理4*4,5*5,6*6的箱子
        int s1=0,s2=0;//s1存储剩余的1*1的空间,s2存储剩余的2*2的空间
        s2=5*order[3];
        s1=11*order[4];
        //处理3*3的箱子,先看需要几个3*3的箱子,不要忘记3*3的剩下的1*1的
         if(order[2]%4==0)
        {
            total=total+order[2]/4;

        }else if(order[2]%4==1)
        {
            total=total+order[2]/4+1;
            s2=s2+5;
            s1=s1+7;
        }else if(order[2]%4==2)
        {
            total=total+order[2]/4+1;
            s2=s2+3;
            s1=s1+6;
        }else if(order[2]%4==3)
        {
            total=total+order[2]/4+1;
            s2=s2+1;
            s1=s1+5;
        }
        //处理2*2的箱子,注意每一步进行后,剩余的空间的统计
        int k=0;
        k=s2-order[1];
        if(k>=0)
        {
            s1=s1+k*4;
        }else
        {
            if((-k)%9==0)
            {
                total=total+(-k)/9;
            }else
            {
                total=total+(-k)/9+1;
                s1=s1+(9-(-k)%9)*4;
            }
        }
        //处理1*1的箱子,
        int t=0;
        t=s1-order[0];
        if(t<0)
        {
            if((-t)%36==0)
            {
                total=total+(-t)/36;
            }else
            {
                total=total+(-t)/36+1;
            }
        }

        if(total==0)
        {
            break;
        }else{
              p[j]=total;  //将每次的结果存放到动态数组p[j]中
        }


     }
    for(i=0;i<j;i++)
    {
        printf("%d\n",p[i]);
    }


    return 0;
}


参考的:

#include <stdio.h>
int main()
{
    int N, a, b, c, d, e, f, y, x ;//N 用来存储需要的箱子数目,y 用来存储2*2 的空位数目
                        // x 用来存储 1*1 的空位数目。
    int u[4]={0, 5, 3, 1};
   // 数组u 表示3*3 的产品数目分别是 4 的倍数,4 的倍数+1, 4的倍数+2, 4的倍数+3
   // 时,为3*3 的产品打开的新箱子中剩余的2*2 的空位的个数

   while(1){
    scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f);
    if (a == 0 && b == 0 && c == 0 && d == 0 && e == 0 && f == 0) break;
    N = f + e + d + (c + 3) / 4;
    // 这里有一个小技巧 - (c+3)/4  正好等于 c 除以4 向上取整的结果, 下同
    y = 5 * d + u[c % 4];
    if(b > y)  N += (b - y + 8 ) / 9;
    x = 36 * N - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;
    if(a > x)  N += ( a - x + 35 ) / 36;
    printf("%d\n", N);
    }
    return 0;
}


下面给出的参考程序看起来比较简洁,最重要的是简单在了这里:

将我的一长串的判断

if((-t)%36==0)

 { total=total+(-t)/36;

}else {

total=total+(-t)/36+1;

 }

用一句((-t)+35)/36就实现了:即实现了(-t)/36向上取整的结果;

将3*3的余数对应的剩余2*2空间的不同的情况放在一个数组里,也是一种巧妙的方法:

int u[4]={0, 5, 3, 1};

但是存在一个问题,没有实现 多行输入 对应 多行输出的条件。

附两张图片,一是今天的时间记录挫折图,柳暗花明又一村:

图二是在纸上画思路的一个草稿:

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值