codevs 2075 yh女朋友的危机 解题报告

前言

说实话,我是看到这个题目才进来的,这个设定?女朋友们?还掉到坑里面?好鬼畜。。。而且,题目标明,这是一道贪心题目,然后我贪了一会儿,才发现是DP!!

正题

题目描述

不知为什么,yh的女朋友们都掉入了一个深度为h的天坑。由于天坑太深,yh的女朋友们无法爬出去,于是她们决定用搭人梯的方式脱困。我们知道yh的每位女朋友从脚到肩膀的高度ai,以及肩膀到伸直手臂的距离bi。由k个人搭成的人梯的高度为a1+a2+…+ak+bk;当人梯高度大于等于h时,第k个人就可以爬出天坑,并再也不进来。你能帮助他的女朋友们安排一个方案,使得最多的女朋友能爬出天坑吗?

思路

题目要求,一个女孩有两个数据,所以结构体储存两个信息,一个是每位女朋友从脚到肩膀的高度ai,以及肩膀到伸直手臂的距离bi。
但是题目规定最后一个人是b加上前面的a。
接下来就是贪心了,按照(a+b)排序。
然后DP,转移方程如下:

dp[j+1]=max(dp[j]-people[i].a,dp[j+1])

然后就好了。

代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
const int M=100000+5;
using namespace std;
int n,height,ans,dp[M];
struct girl
{
    int a,b;//从脚到肩膀的高度a,肩膀到伸直手臂的距离b
    bool operator <(girl other)const
    {
        return a+b<other.a+other.b;
    }
}people[M];
int max(int x,int y)
{
    if (x>=y) return x;
    else return y;
}
int main()
{
    memset(dp,-1,sizeof(dp));
    dp[0]=0;
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&people[i].a,&people[i].b);
        dp[0]+=people[i].a;
    }
    scanf("%d",&height);
    sort(people+1,people+n+1);
    for (int i=1;i<=n;i++)
    for (int j=ans;j>=0;j--)
    {
        dp[j+1]=max(dp[j]-people[i].a,dp[j+1]);
        if (dp[ans+1]>=0) ans++;
    }
    printf("%d",ans);
    return 0;
}

彩蛋

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值