华为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. }
>
>
>
>
> 代码解读
具体我参考的是这篇文章,各位同学注意一定要把输入输出练熟悉了,有很多同学都是有了思路,遇到一个比较奇怪的输入输出就不知道咋写了,非常可惜。
我参考的是这篇文章,讲的还是比较全的:
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)

