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

来源:互联网 发布:软件技术指标怎么写 编辑:程序博客网 时间:2024/05/21 22:23

前言

说实话,我是看到这个题目才进来的,这个设定?女朋友们?还掉到坑里面?好鬼畜。。。而且,题目标明,这是一道贪心题目,然后我贪了一会儿,才发现是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;}

彩蛋

原创粉丝点击