【解题思路】
① 其实题目很简单,但是题目描述写的不太严谨,一开始很迷惑,怎么直线能成为容器了?水量的单位是啥?
② 后来大概明白要干啥后,不如重新表述一下题目:给定n个非负整数 a1,a2, … ,an ,其中每一个 ai 都表示坐标系上的一个点 ( i , ai ) 。沿每一个点画一条垂直于x轴的线段,使每条线段的两个端点为 ( i , ai ) 和 ( i , 0 ) 。每两个线段和x轴能形成一个平面容器,求其中最大的平面容器能装的水量(实际上是面积)。
【1】画图理解(以样例输入输出为例)
如上图,蓝色虚线框所表示的面积就是最大容器能装的水量,为 7*(9-2)=49 。
【2】不确定n的个数的输入
了解题意后还有一个要处理的点,就是输入的n个数是不确定数量的,输入方式介绍下面两种:
① gets输入,用字符数组读入,用另一个整形数组保存,也就麻烦一点点,写成代码如下:
gets(a); // a[i]为char类型的字符数组 for(i=0,j=0;a[i]!='\0';i++) { if(a[i]==' ') j++; else { b[j]*=10; // b[j]为初始化都为0的int类型的整形数组 b[j]+=a[i]-'0'; } }
② while与scanf输入,有以下几种写法:
i=0; while(~scanf("%d",&b[i++]); // 最后加分号表示while中不需要进行其他操作 i=0; while(scanf("%d",&b[i++])!=EOF); // EOF为stdio.h定义的常量,通常值为-1
关于~运算符和scanf函数返回值的知识这里就不展开了,有兴趣的小伙伴可以自己去查。
【注意事项】
① 主要是理解题目意思,本题没啥特殊数据,数据量也不大,直接暴力循环可解;
② 输入数据时需要注意不确定个数的输入方式。
【参考代码】
#include<stdio.h> int main(void) { int a[1000]={0},n=1,max=0; // max保存最大值 while(scanf("%d",&a[n++])!=-1); // 循环输入整数ai for(int i=1;i<=n-1;i++) // a[i]表示左边的线段 for(int j=i+1;j<=n-1;j++) // a[j]表示右边的线段 if(a[j]>a[i]&&a[i]*(j-i)>max) max=a[i]*(j-i); else if(a[i]>a[j]&&a[j]*(j-i)>max) max=a[j]*(j-i); printf("%d",max); return 0; }
0.0分
5 人评分