积木大赛

积木大赛

题目描述
春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值