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

题目

题目描述
又是一年秋季时,陶陶家的苹果树结了 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);
}

陶陶摘苹果(升级版)P1478_巧妙模拟的更多相关文章

  1. 洛谷 P1478 陶陶摘苹果(升级版)

    本萌新第一次发布题解,若有不严谨处请谅解. 我看了前面几位大佬的手笔,表示自己还是比较钟爱桶排序的.它非常简易直接,还省时间,尤其对于这类题目占用的的空间也很小. 我们看到题目下面的说明:xi< ...

  2. 洛谷——P1478 陶陶摘苹果(升级版)

    题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力 ...

  3. 洛谷-陶陶摘苹果(升级版)-BOSS战-入门综合练习1

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

  4. 题解 P1478 【陶陶摘苹果(升级版)】

    看着你们累死累活得快排.冒泡.结构体特殊冒泡.还有dp... 蒟蒻表示真的不用那么麻烦! 难度:新手村+1 压行情况:0 理解难度:0 首先我们来了解一下优先队列:(自己抄的自己...) 讲元素一个个 ...

  5. 洛谷 P1478 陶陶摘苹果(升级版)【贪心/结构体排序/可用01背包待补】

    [链接]:https://www.luogu.org/problemnew/show/P1478 题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他 ...

  6. 常州模拟赛d4t2 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 n 个苹果.苹果成熟的时候,陶陶就会 跑去摘苹果. 陶陶的手不能弯 (他仅能把手伸直),当且仅当陶陶达到的高度与苹果的高度相等的时候,陶陶 ...

  7. P1478 陶陶摘苹果(升级版)

    题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力 ...

  8. 洛谷P1478 陶陶摘苹果(升级版)

    题目数据范围小,开两个数组手写冒泡应该也能过,不过和之前在牛客上的一题类似用结构体数组就好了,主要是注意用结构体数组的排序 题目 题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果 ...

  9. 洛谷P1478 陶陶摘苹果(升级版)【水题】

    又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力气只剩下s ...

随机推荐

  1. SpringMVC 中的异常处理

    目录 1.搭建编码分析 2.编写异常类 3.编写自定义异常处理器 4.在springmvc.xml中配置异常处理器 5.编写Error.jsp.index.jsp页面 6.编写collector代码模 ...

  2. laravel aritisan命令大全

    1常用命令 显示某个命令的帮助 php artisan -h make:controller 实例命令 php artisan make:controller -r Api/TestControlle ...

  3. java架构之路(多线程)原子操作,Atomic与Unsafe魔术类

    这次不讲原理了,主要是一些应用方面的知识,和上几次的JUC并发编程的知识点更容易理解. 知识回顾: 上次主要说了Semaphore信号量的使用,就是一个票据的使用,我们举例了看3D电影拿3D眼镜的例子 ...

  4. 时间序列数据库(TSDB)初识与选择

    时间序列数据库(TSDB)初识与选择 本文作者由 MageByte 团队的 「借来方向」编写,关注公众号 给你更多硬核技术 背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词.大数据.人工 ...

  5. Shiro身份验证及授权(二)

    一.Shiro 身份验证 身份验证的步骤: 收集用户身份 / 凭证,即如用户名 / 密码: 调用 Subject.login 进行登录,如果失败将得到相应的 AuthenticationExcepti ...

  6. 前端url参数中带有callback并产生错误

    错误截图: 初步诊断是由于后端返回值的数据格式不正确造成的 解决方式: 1).接受在springmvc中接受callback参数 2).将对象转为Object 3).拼接callback方法,其中返回 ...

  7. Java8新特性一点通 | 回顾字符转日期&JoinArray使用

    StringToDate日期转换 Join Array使用 StringToDate日期转换 Convert string to date in ISO8601 format 利用LocalDate. ...

  8. 实验7:交换机IOS升级

    交换机IOS升级首先需要有IOS文件,如果没有备份原文件的话,可以找个同一版本的IOS来替代. 第一种方法:X-Modem 以前我曾经尝试过一种方法,就是当Flash被删除后,启动无法进入系统,可以用 ...

  9. 再问你一遍,你真的了解try..catch(finally)吗???

    定义 首先来看下 MDN 的定义: The try...catch statement marks a block of statements to try and specifies a respo ...

  10. how to convert wstring to string

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <local ...