没有输出 求助
查看原帖
没有输出 求助
421758
HANDSOME_FZZ楼主2023/7/13 15:23
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int M=2005;
const int N=105;
const int INF=1e+9;
int time,n=1,f[N][M],m;//在节点n的子树上盗取m幅画所花的时间 
//之所以不用在节点n的子树上用m s盗取的画 是因为枚举时间的循环次数比枚举画的数量多得多且情况更复杂 

struct tree{
	int l,r,w,j;
}q[N];

void dfsload(int p,int x){//
	n++; int now=n;
	cin>>q[n].w>>q[n].j;//走过一条走廊到达本节点的时间 藏画的数量 
	m+=q[n].j;
	if(x==0) q[p].l=n;
	else q[p].r=n;
	if(q[now].j==0){
		dfsload(now,0); dfsload(now,1);
	}
}

void checktree(int p){
	if(p>n||p==0) return;
	cout<<p<<' '<<q[p].l<<' '<<q[p].r<<' '<<q[p].w<<' '<<q[p].j<<endl;
	checktree(q[p].l); checktree(q[p].r);
}

void solve(int p){
	if(p==0) return;
	if((q[p].l==0)&&(q[p].r==0)){//到达叶子结点 
		f[p][0]=0;
		for(int i=1;i<=q[p].j;i++) f[p][i]=i*5+q[p].w*2;
		return;//到画室盗画 
	}
	solve(q[p].l); solve(q[p].r);
	q[p].j=q[q[p].l].j+q[q[p].r].j;//子结点所有画的数量
	for(int i=0;i<=q[q[p].l].j;i++)
		for(int j=0;j<=q[q[p].r].j;j++){
			f[p][i+j]=min(f[p][i+j],(f[q[p].l][i]+f[q[p].r][j]+q[p].w*2));
			//cout<<f[2][i+j]<<' '<<(f[q[2].l][i]+f[q[2].r][j]+q[2].w*2)<<endl;
		}
}

int main(){
	freopen("gallery.in","r",stdin);
	for(int i=0;i<N;i++)
		for(int j=0;j<M;j++) f[i][j]=INF;
	cin>>time;
	dfsload(1,0);
	//checktree(1);这个树健康得很 
	solve(1);
	for(int i=m;i>=0;i--){
		if(f[1][i]<time){
			cout<<i<<endl; break;
		}
	}
	//for(int i=1;i<=n;i++) cout<<q[i].j<<endl;
	return 0;
}
2023/7/13 15:23
加载中...