我们只有将牛的乳房开进牛棚,你才能开始清洁乳房,在清洁乳房之前,您不能挤奶。 我们呼吁为完成这项工作作好这些准备。 至少有一件杂务不需要准备,可以尽早开始,标记为杂项1。 有一个列表的 n 家务要完成,此列表是有序的,和杂务 k (k>1) 的准备工作可能只在杂项 1 到 k-1。
将程序从 1 到 n 读入每个杂务的工作说明中。计算完成所有家务的最短时间。当然,彼此无关紧要的家务劳动可以同时工作,你可以假设农场有足够的工人同时完成任意数量的任务。
第1行:整数n,必须完成的家务劳动数量(3≤n≤10,000);
2 到 (n-1)分别是
* 工作序列号(输入文件中订购的 1 到 n):
* 完成工作所需的时间(1≤n≤100):
* 必须完成的一些筹备工作,总数不超过100人,最后为0人。有些家务活没有工作准备只描述单独的 0,并且整个输入文件中没有额外的空间。
输出格式
表示完成所有家务所需的最短时间的整数。
输入和输出的示例
进入
7
1 5
0 2 2 1 0
3 3 2
0 4 6
1 0 5 1 2 4 0 6 8 2 4 0
7 4 3 5 6 0
输出
23
我们分析的主题是:
我们可以理解,每当我们开始做第一步,我们穿越准备工作选择最多的时间,其他等价物包括在内,然后我们比较每一步的大小,选择最多的时间:
补充一下就是作为我们在循环的时后可以一直输入直到出现0
#include<iostream> #include<algorithm> using namespace std; int n,l,t,ans[10005],ma; int main() { cin>>n;//几个工作 for(int i=1;i<=n;++i){ cin>>i>>l;//序号 //工作时间 int tmp=0; while(cin>>t&&t)//当t!=0 tmp=max(ans[t],tmp);//预备事件最大值 ans[i]=tmp+l; ma=max(ans[i],ma);//步数时间要最大值 } cout<<ma; return 0; }