洛谷P1046 [NOIP2005 普及组] 陶陶摘苹果

洛谷P1046 [NOIP2005 普及组] 陶陶摘苹果

[NOIP2005 普及组] 陶陶摘苹果

题目描述

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

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

100 200 150 140 129 134 167 198 200 111
110

样例输出 #1

5

提示

【题目来源】

NOIP 2005 普及组第一题

题目解析

题目大意

本题是树上有十个苹果,长在不同的高度上。陶陶有一把高三十公分的凳子,求出他借助凳子最高可以摘到几个苹果。

题目分析

题目让用户输入十个苹果的高度和陶陶的身高,那么只需要依次遍历每个苹果的高度,和陶陶身高+凳高作比较,如果身高+凳高大于苹果高度,则统计他可以摘到的数量加一。

接下来就是考虑如何存储这十个苹果和让它们比较。
我们首先想到的就是使用一个一维数组来存储这十个苹果,然后通过依次遍历数组来判断大小。
其次可以考虑使用栈结构先存储苹果的信息,然后再依次出栈进行比较。

代码题解

解法1:数组

    #include 
    using namespace std;

    int fun()//编写函数fun来处理异常输入
    {
	    int n=0;//用户每次输入的苹果高度
	    cin>>n;
	    if(n<100||n>200)//非法输入
	    {
		    cout<<"error"<<endl;
		    return fun();//递归重新输入
	    }
	    else
	    {
		    return n;
	    }
    }
    int main()
    {
	    int count=0;
	    int a[10];
	    for(int i=0;i<10;i++)
	    {
		    a[i]=fun();
	    }
	    int hight;//陶陶身高
	    cin>>hight;
	    hight+=30;//加了凳子后的总高度
	    for(int j=0;j<10;j++)
	    {
		    if(a[j]<=hight)//依次把苹果高和人的总高度比较
		    {
			    count++;
		    }	
	    }
	    cout<<count;
	    return 0;
    }


解法2:栈

    #include 
    #include 
    using namespace std;
    int main()
    {
	    stack<int> apple_height;
	    int height,appleheight;
	    
	    
	    int count=0,counter=0;
	    
	    do
	    {
		    int n;
		    cin>>n;
		    if(n>=100&&n<=200)
		    {
			    apple_height.push(n);
			    counter++;
			    continue;
		    }
		    else
		    {
			    cout<<"error"<<endl;
			    continue;
		    }
	    }while(counter < 10);

	    cin>>height;
	    height+=30;
	    while(!apple_height.empty())
	    {
		    appleheight=apple_height.top();
		    
		    apple_height.pop();
		    
		    if(appleheight<height)
		    {
			    count++;
		    }	
	    }
	    // 额外判断最后一个符合条件的苹果
        if (appleheight < height)
        {
            count++;
        }  
	    cout <<count;
	    return 0;
    }

在第一次的程序中,我最后只判断到了while(!empty),这样会导致出完栈之后的最后一个数组没有比较而直接结束,因此我又添加了对最后一个出栈的数的比较。


你可能感兴趣的:(C++必刷题,算法,c++,学习,笔记)