洛谷题库入门:P1046陶陶摘苹果

171 阅读1分钟

题目链接:P1046 [NOIP2005 普及组] 陶陶摘苹果

题目概况

[NOIP2005 普及组] 陶陶摘苹果

题目描述

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 1010 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 3030 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知 1010 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

输入格式

输入包括两行数据。第一行包含 1010100100200200 之间(包括 100100200200 )的整数(以厘米为单位)分别表示 1010 个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个 100100120120 之间(包含 100100120120 )的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

输出格式

输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

提示

【题目来源】

NOIP 2005 普及组第一题

分析

设这10个树高分别为:h1h_1h2h_2h3h_3h4h_4h5h_5h6h_6h7h_7h8h_8h9h_9h10h_{10}

再设陶陶的身高为hh

这个题目就是让我们求h+30h+30大于等于几个hi(1i10)h_i(1 \le i \le 10)

因此,程序如下。

程序

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int tree_high[10],high,sum;
    for(int i=0;i<10;++i)scanf("%d",&tree_high[i]);
    scanf("%d",&high);
    for(int i=0;i<10;++i)
    {
        if(tree_high[i]<=high+30)
        {
            sum++;
        }
    }
    printf("%d",sum);
    return 0;
}

优化

首先,tree_high<=high+30这一条语句,high+30要反复计算,对性能会有一点影响,所以可以在循环之前将high加30;

其次,sum变化的时候要么加1,要么加0,所以可以改成sum+=(tree_high[i]<=high+30)。

优化后程序如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int tree_high[10],high,sum;
    for(int i=0;i<10;++i)scanf("%d",&tree_high[i]);
    scanf("%d",&high);
    high+=30;
    for(int i=0;i<10;++i)
    {
        sum+=(tree_high[i]<=high+30);
    }
    printf("%d",sum);
    return 0;
}