积木大赛
题目描述
春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi
在搭建开始之前,没有任何积木(可以看成n块高度为0的积木)。接下来每次操作,小朋友们可以选择一段连续区间[l, r],然后将第 L块到第 R 块之间(含第 L 块和第 R块)所有积木的高度分别增加1。
小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。
输入格式
包含两行,第一行包含一个整数n,表示大厦的宽度。
第二行包含n个整数,第i个整数表示i位置的高度。
输出格式
建造所需的最少操作数。
样例输入:
5
2 3 4 1 2
输出:
5
这道题我刚开始走错了方向,使用数组去计算,结果只能过八个点,后面两个点一直超时。
后来借鉴大佬的思路重新写了一个简洁的代码,如下:
第一次思路
主要利用数组在连续的区间每次减一的方法进行计算,若果有兴趣可以了解一下,很锻炼思维能力。。。hahah
#include<stdio.h>
int main()
{
int a,b,c,n,sum=0,flag=1,min=99999,max=1;
int A[100005]={0};
scanf("%d",&n);
for(a=1;a<=n;a++)
scanf("%d",&A[a]);
for(a=1;a<=n;a++)
{
if(A[a]>max)max=a;
if(A[a]<min)min=A[a];
}
for(a=1;a<=n;a++)A[a]=A[a]-min;
sum=min;
c=0;
for(a=1;a<=n;a++)
{
if(A[a]==0){
flag=1;
}
else {
if(flag==1)
{
sum++;
flag=0;
}
A[a]--;
}
if(a==n){
c=0;
for(b=1;b<=n;b++){
if(A[b]==0)c++;
if(c==n)
{
a=n+1;
}
}
}
if(a==n)
{
flag=1;
a=0;
}
}
printf("%d\n",sum);
return 0;
}
第二次思路
这一次主要是利用最长递增序列,需要的最少步骤一定是最高的哪一个,将他们分段进行计算,就可以了。
#include<stdio.h>
int main()
{
int a,b,c=0,n,sum=0;
scanf("%d",&n);
for(a=1;a<=n;a++)
{
scanf("%d",&b);
if(b>c)
{
sum=sum+b-c;
c=b;
}
else c=b;
}
printf("%d\n",sum);
return 0;
}