DotcppXF


私信TA

用户名:dotcpp0599925

访问量:2121

签 名:

层楼终究误少年

等  级
排  名 151
经  验 6163
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校 华南理工大学
专  业 计算机科学与技术

  自我简介:

The sad truth is, not everyone will accomplish something great. Some of us may just have to find meaning in the little moments that make up life.


【解题思路】


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

        ② 后来大概明白要干啥后,不如重新表述一下题目:给定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分

3 人评分

  评论区