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