洛谷 P1156 垃圾陷阱
阿新 • • 發佈:2019-02-10
pro mat getc spa tin getch main sort algorithm
傳送門:洛谷 P1156 垃圾陷阱
算法分析:
\(dp[i][j]\) 表示吃了第 \(i\) 個垃圾後到 \(j\) 高度的最大生命值,則先判斷能否活下來,如能,判斷有沒有跳出陷阱;若沒有,就分兩種情況:上升或活命。如果跳不出,就貪心求最大高度
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxN=100,maxH=100; struct Node { int t,f,h; }a[maxN+1]; int d,n,dp[maxN+1][maxN+1],ans=0; inline int read(); bool comp(Node x,Node y) { return x.t<y.t; } int main() { d=read(); n=read(); memset(dp,-1,sizeof(dp)); for(int i=1;i<=n;i++) { a[i].t=read(); a[i].f=read(); a[i].h=read(); } dp[0][0]=10; sort(a+1,a+n+1,comp); for(int i=1;i<=n;i++) for(int j=0;j<=d;j++) { if(dp[i-1][j]<0) continue; if(dp[i-1][j]>=a[i].t-a[i-1].t && j+a[i].h>=d) { printf("%d",a[i].t); return 0; } if(dp[i-1][j]>=a[i].t-a[i-1].t) { dp[i][j+a[i].h]=dp[i-1][j]-a[i].t+a[i-1].t; dp[i][j]=max(dp[i][j],dp[i-1][j]-a[i].t+a[i-1].t+a[i].f); } } for(int i=1;i<=n;i++) for(int j=0;j<=d;j++) if(dp[i][j]!=-1) ans=max(ans,dp[i][j]+a[i].t); printf("%d",ans); return 0; } inline int read() { char ch=getchar(); int f=1,num=0; while((ch<‘0‘ || ch>‘9‘) && ch!=‘-‘) ch=getchar(); if(ch==‘-‘) {f=-1; ch=getchar();} while(ch>=‘0‘ && ch<=‘9‘) { num=num*10+ch-‘0‘; ch=getchar(); } return num*f; }
洛谷 P1156 垃圾陷阱