第一次竞赛-C.搬家

Alice准备搬家,他把自己的物品都装到箱子里,并在箱子上贴了箱子的重量。装箱后要将这些箱子运到卡车上运去新的住所。将箱子往卡车上运的时候,需要把它堆起来以节省卡车上的空间。而堆砌的时候如果上方的箱子比下方箱子更重,那么会把下方箱子压坏,这时就需要重新堆另一堆。Alice希望你写一个程序帮助计算出最少堆几垛箱子。

输入内容

输入形式为

N
w1
w2
...
wN

输入共N+1行,第1行有一个数字N表示有N个箱子,后续有N行,每行一个数字表示箱子的重量

0≤N≤50
0≤wi≤100000

输出内容

输出为一个整数。表示按照输入的顺序w1,w2,...,wN,逐个将箱子堆到卡车上所装最少的堆数

样例1

输入

5
4
3
1
2
1

输出

2

提示

按照输入的顺序将箱子搬到车上,最少可以堆成两垛,从下向上表示为一堆是[4,3,2],另一堆[1,1]

样例2

扫描二维码关注公众号,回复: 5082278 查看本文章

输入

7
93
249
150
958
442
391
25

输出

3

提示

第一堆为[93],第二堆[249,150],第三堆[958,442,391,25]

样例3

输入

4
100
100
100
100

输出

1

提示

所有箱子重量相同,只需要堆一垛就可以。

样例4

输入

6
5
10
15
20
25
30

输出

6

提示

按这个顺序装车,箱子不能堆在之前的箱子上,所以要堆6垛箱子

样例5

输入

15
3
1
4
1
5
9
2
6
5
3
5
8
9
7
9

输出

6

题解:这类算法叫作模拟,就是需要你用程序模仿问题,很多问题没有规律没有公式就只能按照题给的过程进行模拟。车上空间总能容纳我们的所有箱子,当搬一只箱子的时候,我们去前边已经堆好的那些垛里看看这只箱子能否堆在它们上边,若能就堆到上边,若不能就另开一堆。每次只需要关注已经堆好的箱子的最上层,我们就可以只用一个数组,数组的每一位表示一个堆最上层的重量。初始设定一个值比如为0,表示没有这一堆没有堆过箱子。我们依次检查所有顶层非0的箱子a[j],如果当前箱子x比顶层a[j]更轻,说明可以将x堆在a[j]之上。否则遍历到a[j]==0时说明当前箱子x比之前所有箱子的顶层都重,只好堆在新的一堆上,将a[j]=0更新为a[j]=x并增加堆的计数,所有箱子全遍历之后,输出堆的计数. 

/*#include<stdio.h>

int main()
{
   int n,num,count=0;
   scanf("%d\n",&n);
   int a[n+1];
   for(int i=0;i<n;i++){
   scanf("%d\n",&num);
   a[i]=num;
   }
   for(int i=1;i<=n;i++){
       if(a[i-1]>a[i])
     count++;
   }
   printf("%d",count);
   
    return 0;
}
    
*/
#include <stdio.h>
#define EMPTY_FLAG 0
int main(void)
{
    int i,j,trunk,N,count=0;
    scanf("%d",&N);
    int pile[N];
    for(i=0;i<N;i++)//数组赋初值
        pile[i]=EMPTY_FLAG;
    for(i=0;i<N;i++)//每输入一个数,都与前一个数进行比较,若小于 则覆盖掉,最后若pile[j]为0,则有j个堆(0~j-1都有数)
    {
        scanf("%d",&trunk);
        for(j=0;j<N;j++)
        {
            if(trunk<=pile[j])
            {
                pile[j]=trunk;
                break;//
            }
            if(pile[j]==EMPTY_FLAG)
            {
                pile[j]=trunk;
                count++;
                break;//
            }
        }
    }
    printf("%d\n",count);
    return 0;
}
    

猜你喜欢

转载自blog.csdn.net/qq_37503890/article/details/86546983
今日推荐