zoukankan      html  css  js  c++  java
  • [题解]陶陶摘苹果(升级版)

    如此水的题居然让我绞尽脑汁,我在想我是不是快退役了.
    这道题我看见很多解法:贪心,背包,桶排乱七八糟一大堆.

    题目

    题目描述
    又是一年秋季时,陶陶家的苹果树结了 n 个果子。陶陶又跑去摘苹果,这次他有一个 a 公分的椅子。当他手够不着时,他会站到椅子上再试试。

    这次与 NOIp2005 普及组第一题不同的是:陶陶之前搬凳子,力气只剩下 s 了。当然,每次摘苹果时都要用一定的力气。陶陶想知道在 s<0 之前最多能摘到多少个苹果。

    现在已知 nn 个苹果到达地上的高度 x[i],椅子的高度 a,陶陶手伸直的最大长度 b,陶陶所剩的力气 s,陶陶摘一个苹果需要的力气 y[i],求陶陶最多能摘到多少个苹果。

    输入格式
    第 1 行:两个数 苹果数 n,力气 s。
    第 2 行:两个数 椅子的高度 a,陶陶手伸直的最大长度 b。
    第 3 行~第 3+n-1 行:每行两个数 苹果高度 x[i],摘这个苹果需要的力气 y[i]

    输出格式
    只有一个整数,表示陶陶最多能摘到的苹果数。

    虽然拿题目来凑篇幅是有一种很不道德的行为,但是我怕你没做过这题,所以...嘿嘿.

    做法

    既然他让我们求最多能拿多少个苹果,我们很容易想到背包.但是细细一想好像又不是,毕竟他的前辈可是一道大水题,那么既然他是由前一个题目叠加而作,那么我们把它分开求解即可.

    我们可以将苹果分为两类,能拿的和不能拿的.
    而不能拿的苹果又有两类,身高不够高而不能拿的和体力不够多而不能拿的.
    那么我们在一开始读入的时候就将他们给去掉,可以节省很多大麻烦,我们并不用关心那些拿不了的.

    而这样读入就有两种方式:

    int p, m;
    int x[6000], y[6000];
    for(int i = 1; i <= n; i++)
    {
        读入p和m
        if(条件符合)
            x[++cnt1] = p, y[++cnt2] = m;//存入
    }
    

    第二种则是用while读入,

    int h = a + b;
    int t = n;
    while(t != 0)
    {
    	scanf("%d%d", &x[k], &y[k]);
    	t--;//读了一个减一个
    	if(x[k] > h || y[k] > s)//条件符合
    		x[k] = y[k] = 0;//清空
    	else
    		k++;//计数器加一位
    }
    

    本人使用第二种,更推荐第一种.

    第二步,我们只需要贪心最小的y[i]就好了,毕竟耗费的体力越少摘得越多嘛~而且这是不必担心x与y的值会乱掉了,因为我们不需要再关心x了.
    将y排序一边,体力值减掉,答案加起来.于是这道题就被我们使用巧妙的模拟解决掉了.

    代码

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int n, s, a, b;
    int k = 1;
    int x[6000], y[6000];
    int ans;
    int main()
    {
    	scanf("%d%d%d%d", &n, &s, &a, &b);
    	int h = a + b;
    	int t = n;
    	while(t != 0)
    	{
    		scanf("%d%d", &x[k], &y[k]);
    		t--;
    		if(x[k] > h || y[k] > s)
    			x[k] = y[k] = 0;
    		else
    			k++;
    	}
    	k--; 
    	sort(y + 1, y + 1 + k);
    	for(int i = 1; i <= k; i++)
    	{
    		s -= y[i];
    		if(s >= 0)
    			ans++;
    		else
    			break;	
    	}
    	printf("%d", ans);
    }
    
  • 相关阅读:
    ThinkPHP where方法:设置查询或操作条件
    微信小程序showToast延迟跳转页面
    uniapp微信小程序授权登录
    什么是二维码,什么是QR码?
    微信小程序授权登录开发流程图
    微信小程序提交审核并发布详细流程(一)
    微信小程序提交审核并发布详细流程2
    uniapp医院预约挂号微信小程序
    《爆款文案》写文案只需要四个步骤
    Spark学习笔记——读写ScyllaDB
  • 原文地址:https://www.cnblogs.com/ahann/p/12369516.html
Copyright © 2011-2022 走看看