2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) A. Altruistic Amphibians (DP)

时间:2022-08-06 11:28:21

题目链接:https://codeforc.es/gym/101933/problem/A

题意:有 n 只青蛙在一个坑里面,要求可以跳出坑的青蛙的最大数量。每个青蛙有 3 种属性:l 为青蛙一次可以跳的高度,w 为青蛙的重量,h 为青蛙作为垫背时的高度,垫背的前提是垫背的青蛙的重量比在他上面的青蛙的总重量要小。

题解:首先将青蛙按重量排序,dp[j]表示在已经垫背的青蛙上面还可以放一个重量  < j 的青蛙时的垫背最大高度,更新的时候,因为重量从大到小排序,dp[j] 由 dp[j + a[i].w] 转移而来,表示把当前的青蛙放到最上面时垫背的最大高度。详见代码~

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 1e5 + ;
const int MAXM = 1e8 + ;
const ll mod = 1e9 + ; struct node {
int l,w,h;
}a[MAXN]; bool cmp(node x,node y) {
return x.w > y.w;
} int dp[MAXM]; int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
mst(dp, );
int n,d;
scanf("%d%d",&n,&d);
for(int i = ; i < n; i++)
scanf("%d%d%d",&a[i].l,&a[i].w,&a[i].h);
sort(a,a + n,cmp);
int ans = ;
for(int i = ; i < n; i++) {
if(dp[a[i].w] + a[i].l > d) ans++;
int mx = min((int)1e8 - a[i].w, a[i].w);
for(int j = ; j < mx; j++) {
dp[j] = max(dp[j],dp[j + a[i].w] + a[i].h);
if(dp[j] > MAXM) dp[j] = MAXM;
}
}
printf("%d\n",ans);
return ;
}