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
输入
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;
}