//物品为基准 #include <bits/stdc++.h> using namespace std; int mx; long long dp[501][2001]; int tim[501];int num[501]; void dfs1(int rt){ scanf("%d%d",&tim[rt],&num[rt]); if(num[rt]==0){ dfs1(rt<<1); dfs1(rt<<1|1); } } void dfs2(int rt){ if(!num[rt])dfs2(rt<<1),dfs2(rt<<1|1); if(num[rt]){ for(int i=0;i<=num[rt];i++)dp[rt][i]=5*i; } int ll=rt<<1;int rr=rt<<1|1; for(int i=0;i<=121;i++){ for(int j=0;i+j<=121;j++){ long long tmp=dp[ll][i]+dp[rr][j]; if(i!=0)tmp+=tim[ll]*2; if(j!=0)tmp+=tim[rr]*2; dp[rt][i+j]=min(dp[rt][i+j],tmp); } } } int main(){ scanf("%d",&mx); for(int i=0;i<=500;i++)for(int j=0;j<=120;j++)dp[i][j]=2e9; dfs1(1);dfs2(1); for(int i=120;i>=1;i--){ if(dp[1][i]+tim[1]*2<mx){ printf("%d",i); break; } } }
//时间为基准 #include <bits/stdc++.h> using namespace std; int mx; long long dp[501][701]; int tim[501];int num[501]; void dfs1(int rt){ scanf("%d%d",&tim[rt],&num[rt]); if(num[rt]==0){ dfs1(rt<<1); dfs1(rt<<1|1); } } void dfs2(int rt){ if(!num[rt])dfs2(rt<<1),dfs2(rt<<1|1); if(num[rt]){ for(int i=1;i<=num[rt];i++) for(int i=600;i>=5;i--){dp[rt][i]=max(dp[rt][i-5]+1,dp[rt][i]);} return; } int ll=rt<<1;int rr=rt<<1|1; for(int i=0;i<=mx-1;i++){ for(int j=0;i+j<=mx-1;j++){ long long tmp=i+j; if(dp[ll][i]!=0)tmp+=tim[ll]*2; if(dp[rr][j]!=0)tmp+=tim[rr]*2; dp[rt][tmp]=max(dp[rt][tmp],dp[ll][i]+dp[rr][j]); } } } int main(){ scanf("%d",&mx); dfs1(1);dfs2(1); printf("%lld",dp[1][mx-1-tim[1]*2]); }