萌新求助站外题
  • 板块学术版
  • 楼主⚡小林子⚡海棠喵
  • 当前回复26
  • 已保存回复26
  • 发布时间2020/8/2 18:57
  • 上次更新2023/11/6 21:29:16
查看原帖
萌新求助站外题
100910
⚡小林子⚡海棠喵楼主2020/8/2 18:57

RT

题目描述 
农场主FJ的家人在挤奶的时候,会尽尽可能地做些家务。在FJ家里,有些家务活要等其他家务活完成后才能开始,例如,只有奶牛在进入牛栏之后、才能给奶牛洗澡。
FJ有一份必须完成的N(3<=N<=10000)家务活清单,每个家务需要一个整数时间(1<=时间长度<=100)才能完成,并且可能有其他家务活必须在该家务开始之前完成,我们将这些称为先决家务。
至少有一件家务活没有先决条件:第一件、数字1。FJ的家务活列表排列很有条理,家务K(K>1)只能有家务1~K-1作为先决家务。
编写一个程序,读取从1到N的家务列表以及相关时间和所有先决家务。现在计算完成所有N项家务所需的最短时间,当然不相互依赖的家务活可以同时进行。

输入格式
第1行:一个整数,N
第2..N+1行: 每行有几个空格分隔的整数。第2行包含家务1的信息,第3行包含家务2的信息,依此类推。每行包含完成家务的时间长度、先决家务数目Pi(0<=Pi<=100)和Pi个先决条件。

输出格式
完成所有家务所需的最短时间 

输入样例
7
5 0
1 1 1
3 1 2
6 1 1
1 2 2 4
8 2 2 4
4 3 3 5 6

输出样例
23 

不要跟我说什么 P1113,那题我的代码改完输入过了,但是仍然站外爆零 /kk

Code:

#include<cstdio>
#include<vector>
#define max(x,y) (x<y?y:x)
int n,l,ans,tmp,t[10005],d[10005];
std::vector<int>G[10005];
int dp(int x){
	if(d[x]) return d[x];
	d[x]=t[x];
	for(int i=0;i<G[x].size();i++)
		d[x]=max(d[x],dp(G[x][i])+t[x]);
	return d[x];
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&t[i],&l);
		while(l--)
			scanf("%d",&tmp),G[tmp].push_back(i);
	}
	for(int i=1;i<=n;i++)
		ans=max(ans,dp(i));
	printf("%d",ans);
    return 0;
}
2020/8/2 18:57
加载中...