此题为坑啊啊!
#include<iostream> #include<cassert> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<string> #include<iterator> #include<cstdlib> #include<vector> #include<stack> #include<map> #include<set> using namespace std; #define debug(x) cout<<"debug "<<x<<endl; #define LLD "%I64d" #define rep(i,f,t) for(int i = (f),_end_=(t); i <= _end_; ++i) #define rep2(i,f,t) for(int i = (f),_end_=(t); i < _end_; ++i) #define dep(i,f,t) for(int i = (f),_end_=(t); i >= _end_; --i) #define dep2(i,f,t) for(int i = (f),_end_=(t); i > _end_; --i) #define clr(c, x) memset(c, x, sizeof(c) ) typedef long long int64; const int INF = 0x5f5f5f5f; const double eps = 1e-8; int n,tm; int a[110]; int d[110][660]; void solve(int id,int t,int v) { d[id][0] = t; a[id] = v; if(v > 0) { for(int i = 1; i <= v; ++i) { d[id][i] = d[id][i-1] + 5; } d[id][0] = 0; return ; } int x1,x2,y1,y2,lc,rc; scanf("%d%d",&x1,&y1); solve(lc = ++n, x1*2, y1); scanf("%d%d",&x2,&y2); solve(rc = ++n, x2*2, y2); int up = a[id] = a[lc] + a[rc]; for(int i = 1; i <= up; ++i) { rep(j,0,a[lc]) { int k = i - j; if(k < 0 || k > a[rc])continue; d[id][i] = min(d[lc][j] + d[rc][k] + d[id][0] , d[id][i]); } } d[id][0] = 0; } int main() { scanf("%d",&tm); if(tm < 5) { printf("0\n"); return 0; } n = 1; int x,y; scanf("%d%d",&x,&y); clr(d,INF); solve(1,x*2,y); int i = upper_bound(d[1], d[1]+125, tm) - d[1] - 1; assert(i >= 0); printf("%d\n",i); return 0; }