Advertisement

华为od机试真题 C语言 实现【太阳能板最大面积】

阅读量:

所有题目均有五种语言实现。C实现目录[C++ 实现目录]( "C++ 实现目录")** 、Python实现目录Java实现目录JavaScript实现目录**

题目

给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条 ),再在支柱的中间部分固定太阳能板。

但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧 的那根支柱长度。如图:

现提供一组整形数组的支柱高度数据,假设每根支柱间距离相等为1个单位长度,计算如何选择两根支柱可以使太阳能板的面积最大。

输入描述:

10,9,8,7,6,5,4,3,2,1

注:支柱至少有2根,最多10000根,能支持的高度范围1~10^9的整数。柱子的高度是无序的,例子中递减只是巧合。

输出描述:

可以支持的最大太阳能板面积:(10米高支柱和5米高支柱之间)

25

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

10,9,8,7,6,5,4,3,2,1

输出

25

备注:

  • 10米高支柱和5米高支柱之间宽度为5,高度取小的支柱高也是5,面积为25。
  • 任取其他两根支柱所能获得的面积都小于25。
  • 所以最大的太阳能板面积为25。

思路

1:注意题目中黑色加粗字体,我们理解一下。也就是说对于两根柱子而言,即使一个是1,一个是9,那么这个太阳能板能安装的最大面积也只是取决于最短柱子的长度,因此我们在获取这两根柱子高度时,应该选择min(arr[i],arr[j])来作为太阳能板的高度。

2:而太阳能板的宽度,则是两根柱子的索引差,用j-i即可。

3:用一个变量来保存最大的面积,通过不断比较更新最大面积。

4:暴力法 :只要两轮遍历求每两个柱子之间的组合面积即可

5:双指针法: 初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。

因为每次移动短板,这个太阳板的最短板可能变大,下一个太阳板的面积可能增大。

而如果移动长板,则这个太阳板的短板不变或者变小,下一个太阳板的面积必然变小。

因此应该移动短板。

C语言输入输出

机试的输入数据常要求有多组,并且格式多种多样,这是初次登机试平台的同学的一个障碍。实际上,这些格式可以归为固定的几种类型,这里介绍各种类型的处理方法,以帮助同学们克服这些障碍。

1:简单输入

复制代码
>       1. #include <stdio.h>

>  
>       2. int main()
>  
>       3. {
>  
>       4.     int a,b;
>  
>       5.     scanf("%d %d",&a, &b);
>  
>       6.     printf("%d\n",a+b);  //对其他题目,换成要求的复杂处理与输出
>  
>       7.     return 0;
>  
>       8. }
>  
>  
>  
>  
>     代码解读

2:输入多组数据,直到读至输入文件末尾(EOF)为止

复制代码
>       1. #include <stdio.h>

>  
>       2. int main()
>  
>       3. {
>  
>       4.      int a,b;
>  
>       5.      while(scanf("%d %d",&a, &b) != EOF) // 输入结束时,scanf函数返回值为EOF(-1),即没有数据输入时会退出while循环
>  
>       6.      {
>  
>       7.              printf("%d\n",a+b);
>  
>       8.      }
>  
>       9.      return 0;
>  
>       10. }
>  
>  
>  
>  
>     代码解读

3:输入多组数据,组数由第一个输入数据决定(在开始的时候输入一个N,接下来是N组数据)

复制代码
>       1. #include<stdio.h>

>  
>       2. int main()
>  
>       3. {
>  
>       4.      int n,i;
>  
>       5.      int a,b;
>  
>       6.      scanf("%d",&n);
>  
>       7.      for(i=0;i<n;i++)
>  
>       8.      {
>  
>       9.              scanf("%d%d",&a,&b);
>  
>       10.             printf("%d\n",a+b);
>  
>       11.     }
>  
>       12.     return 0;
>  
>       13. }
>  
>  
>  
>  
>     代码解读

具体我参考的是这篇文章,各位同学注意一定要把输入输出练熟悉了,有很多同学都是有了思路,遇到一个比较奇怪的输入输出就不知道咋写了,非常可惜。

我参考的是这篇文章,讲的还是比较全的:

ACM题目中输入数据的处理(C语言版)_迂者-贺利坚的博客-博客_算法中循环输入用例

Code

复制代码
 #include <stdio.h>

    
 #include <stdlib.h>
    
 #include <string.h>
    
 #include <stdbool.h>
    
 #include <math.h>
    
 #include <limits.h>
    
 #include <float.h>
    
 #include <regex.h>
    
 #include <ctype.h>
    
  
    
 #define CEILING_POS(X) ((X-(int)(X)) > 0 ? (int)(X+1) : (int)(X))
    
 #define CEILING_NEG(X) ((X-(int)(X)) < 0 ? (int)(X-1) : (int)(X))
    
 #define CEILING(X) ( ((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X) )
    
  
    
 #define MIN(a, b) ((a) < (b)) ? (a) : (b)
    
 #define MAX(a, b) ((a) > (b)) ? (a) : (b)
    
  
    
 int cmpfunc (const void * a, const void * b) {
    
    return ( *(int*)a - *(int*)b );
    
 }
    
 //qsort(dp, m+1, sizeof(int), cmpfunc);
    
  
    
 int main() {
    
     //输入
    
     char input[200000];
    
     fgets(input, 200000, stdin);
    
  
    
     //逗号分隔
    
     char* token = strtok(input, ",");
    
     int heights[1000];
    
     int count1 = 0;
    
     while (token != NULL) {
    
     heights[count1++] = atoi(token);
    
     token = strtok(NULL, ",");
    
     }
    
  
    
     int left = 0;
    
     int right = count1 - 1;
    
     int result = 0;
    
  
    
     while (left < right) {
    
     int x = right - left;
    
     int y = heights[left] < heights[right] ? heights[left++] : heights[right--];
    
     result = MAX(result, x * y);
    
     }
    
  
    
  
    
     printf("%d",result);
    
     return 0;
    
 }
    
    
    
    
    代码解读

要求

时间限制:C/C++ 1秒,其他语言 2秒

空间限制:C/C++262144K,其他语言524288K

64bit IO Format:%lld

语言限定:
C(clang11), C++(clang++11), Pascal(fpc 3.0.2), Java(javac 1.8), Python2(2.7.3),
PHP(7.4.7), C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript Node(12.18.2), JavaScript V8(6.0.0),
Sqlite(3.7.9), R(4.0.3), Go(1.14.4), Ruby(2.7.1), Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13),
Pypy3(pypy3.6.1), Rust(1.44), Scala(2.11.12), Kotlin(1.4.10), Groovy(3.0.6), TypeScript(4.1.2), Mysql(8.0)

全部评论 (0)

还没有任何评论哟~