【題解】P1156垃圾陷阱
阿新 • • 發佈:2019-01-29
memset 感覺 amp 比較 str += 復雜 而在 ret
【題解】P1156 垃圾陷阱
乍看此題,我們感覺狀態很多,很復雜。
遇到這類型條件比較多的\(dp\),我們不要首先考慮全部設出來,而是要看到這些狀態的本質。而在這道題目中,時間和高度就是關鍵。
考慮卡門吃掉垃圾:
- 時間改變,高度不變。
考慮卡門墊上垃圾:
- 時間改變,高度改變。
也就是說,垃圾變成了我們的階段,就不需要存垃圾了。(這話怎麽怪怪的)
設\(dp(x)=y\)表示高度為\(x\)時,還剩下\(y\)的時間。轉移就不寫啦咕咕咕
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<queue> #include<bitset> #include<vector> #include<map> #include<ctime> #include<cstdlib> #include<set> #include<bitset> #include<stack> #include<list> #include<cmath> using namespace std; #define RP(t,a,b) for(register int (t)=(a),edd_=(b);t<=edd_;++t) #define DRP(t,a,b) for(register int (t)=(a),edd_=(b);t>=edd_;--t) #define ERP(t,a) for(int t=head[a];t;t=e[t].to) #define Max(a,b) ((a)<(b)?(b):(a)) #define Min(a,b) ((a)<(b)?(a):(b)) #define TMP template<class ccf> typedef long long ll; TMP inline ccf qr(ccf k){ char c=getchar(); ccf x=0; int q=1; while(c<48||c>57) q=c==45?-1:q,c=getchar(); while(c>=48&&c<=57) x=x*10+c-48,c=getchar(); if(q==-1) x=-x; return x; } const int maxn=1e3+15; int dp[maxn];// height x,time y can go // dp[x]=y int n; int h; int t1,t2,t3; struct qts{ int a,b,c; inline void scan(){ a=qr(1); b=qr(1); c=qr(1); } inline bool operator <(qts x){ return a<x.a; } }q[maxn]; int main(){ #ifndef ONLINE_JUDGE freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif h=qr(1); n=qr(1); memset(dp,0xff,sizeof dp); dp[0]=10; RP(t,1,n) q[t].scan(); sort(q+1,q+n+1); RP(t,1,n){ t1=q[t].a; t2=q[t].b; t3=q[t].c; DRP(i,h,0){ if(dp[i]>=t1){ if(t3+i>=h) return cout<<t1<<endl,0; dp[Min(maxn-1,i+t3)]=Max(dp[Min(maxn-1,i+t3)],dp[i]); dp[i]+=t2; } } } cout<<dp[0]<<endl; return 0; }
【題解】P1156垃圾陷阱