【解题思路】


        ① 其实题目很简单,但是题目描述写的不太严谨,一开始很迷惑,怎么直线能成为容器了?水量的单位是啥?

        ② 后来大概明白要干啥后,不如重新表述一下题目:给定n个非负整数 a1,a2, … ,an ,其中每一个 ai 都表示坐标系上的一个点 ( i , ai ) 。沿每一个点画一条垂直于x轴线段,使每条线段的两个端点为 ( i , ai ) 和 ( i , 0 ) 。每两个线段和x轴能形成一个平面容器,求其中最大的平面容器能装的水量(实际上是面积)。



【1】画图理解(以样例输入输出为例)


        1665028050133117.png


        如上图,蓝色虚线框所表示的面积就是最大容器能装的水量,为 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.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论