[洛谷1113]杂务

题目描述

  John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它。比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作。尽早将所有杂务完成是必要的,因为这样才有更多时间挤出更多的牛奶。当然,有些杂务必须在另一些杂务完成的情况下才能进行。比如:只有将奶牛赶进牛棚才能开始为它清洗乳房,还有在未给奶牛清洗乳房之前不能挤奶。我们把这些工作称为完成本项工作的准备工作。至少有一项杂务不要求有准备工作,这个可以最早着手完成的工作,标记为杂务1。John有需要完成的n个杂务的清单,并且这份清单是有一定顺序的,杂务k(k>1)的准备工作只可能在杂务1..k-1中。
  写一个程序从1到n读入每个杂务的工作说明。计算出所有杂务都被完成的最短时间。当然互相没有关系的杂务可以同时工作,并且,你可以假定John的农场有足够多的工人来同时完成任意多项任务。

输入输出格式

输入格式:

第1行:一个整数n,必须完成的杂务的数目(3<=n<=10,000);
第2 ~ n+1行: 共有n行,每行有一些用1个空格隔开的整数,分别表示:
 * 工作序号(1..n,在输入文件中是有序的);
 * 完成工作所需要的时间len(1<=len<=100);
 * 一些必须完成的准备工作,总数不超过100个,由一个数字0结束。有些杂务没有需要准备的工作只描述一个单独的0,整个输入文件中不会出现多余的空格。

输出格式:

一个整数,表示完成所有杂务所需的最短时间。

输入输出样例

输入样例#1:

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

输出样例#1:

23

思路

  做完当前节点的工作的代价等于前面代价之和和当前的节点代价之和。

var a:array[1..10000] of longint;
    i,j,k,l,m,n:longint;
begin
    readln(n);
    fillchar(a,sizeof(a),0);
    m:=0;
    for i:=1 to n do
        begin
            read(k,l,j);
            k:=0;
            while j<>0 do
                begin
                    if a[j]>k then k:=a[j];
                    read(j);
                end;
            a[i]:=k+l;
            if a[i]>m then m:=a[i];
    end;
    write(m);
end.  

  这个可能更直接

program aa;
var t:array[1..10000]of longint;
    n,i,a,b,max,ans:longint;
begin
    readln(n);
    for i:=1 to n do
    begin
        read(a);
        read(t[a]);
        max:=0;
        while 1>0 do
        begin
            read(b);
            if b=0 then break;
            if t[b]>max then max:=t[b];
        end;
        t[a]:=t[a]+max;
    end;
    for i:=1 to n do
        if t[i]>ans then
            ans:=t[i];
    writeln(ans);  

end.  

  听说还可以用最长路做(凯特琳

program exam1;
var map:array[1..1000000,1..3]of longint;
var f:array[1..10000]of longint;
var v:array[1..10000]of boolean;
var h:array[1..1000000]of longint;
var first:array[1..10000]of longint;
var bb:array[1..10000]of longint;
var tot,i,j,n,x,y,z,l,r,q,tt,qi,zhong,ans,len,num:longint;
procedure insert(a,b,c:longint);
begin
inc(tot);
map[tot,1]:=b;
map[tot,2]:=c;
map[tot,3]:=first[a];
first[a]:=tot;
end;
procedure spfa(ss:longint);
begin
//for i:=1 to n do
//if i<>ss then f[i]:=100000000;
fillchar(h,sizeof(h),0);
l:=0;
r:=1;
h[1]:=ss;
v[ss]:=true;
while l<r do
begin
inc(l);
q:=h[l];
tt:=first[q];
while tt<>0 do
begin
if f[map[tt,1]]<f[q]+map[tt,2] then
begin
f[map[tt,1]]:=f[q]+map[tt,2];
if f[map[tt,1]]>ans then
ans:=f[map[tt,1]];
if not v[map[tt,1]] then
begin
inc(r);
h[r]:=map[tt,1];
v[map[tt,1]]:=true;
end;
end;
tt:=map[tt,3];
end;
v[q]:=false;
end;
end;  

procedure search;
var ii:longint;
begin
for ii:=1 to n do
if f[ii]>ans then
ans:=f[ii];
end;  

begin
read(n);
for i:=1 to n do
begin
read(zhong);
read(len);
read(qi);
if qi=0 then
begin
inc(num);
bb[num]:=zhong;
f[zhong]:=len;
end
else
while qi<>0 do
begin
insert(qi,zhong,len);
read(qi);
end;
end;  

//for i:=1 to n do
//if f[i]=0 then f[i]:=100000000;
for i:=1 to num do
spfa(bb[i]);
//search;
writeln(ans);
end.  

  另一种用图做的模型(路边的水沟 )

var
  n:longint;
  f:array[0..10000] of longint;
  i,s,h,t,max:longint;
  ans:longint;
begin
  readln(n);
  for i:=1 to n do
    begin
    read(s); //读入。s为当前处理项编号,t为当前处理项耗时。
    read(t);
    read(h);
    max:=0;
    while h>0 do
      begin
      if f[h]>max then max:=f[h]; //从当前处理项必须完成的任务中寻找耗时最大的一项。此时默认已经把可以同时进行的项目同时进行,所得总和结果为最小。
      read(h);
      end;
    readln;
    f[s]:=max+t; //加上当前处理项的耗时
    if f[s]>ans then ans:=f[s];
    end;
  writeln(ans);
end.  

时间: 2024-11-05 11:54:37

[洛谷1113]杂务的相关文章

洛谷P1113 杂务

题目描述 John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它.比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作.尽早将所有杂务完成是必要的,因为这样才有更多时间挤出更多的牛奶.当然,有些杂务必须在另一些杂务完成的情况下才能进行.比如:只有将奶牛赶进牛棚才能开始为它清洗乳房,还有在未给奶牛清洗乳房之前不能挤奶.我们把这些工作称为完成本项工作的准备工作.至少有一项杂务不要求有准备工作,这个可以最早着手完成的工作,标记为杂务1.John有需要完成

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不

洛谷P1466 集合 Subset Sums

洛谷P1466 集合 Subset Sums这题可以看成是背包问题 用空间为 1--n 的物品恰好填充总空间一半的空间 有几种方案 01 背包问题 1.注意因为两个交换一下算同一种方案,所以最终 要 f [ v ] / 2 2.要开 long long 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <string&g

洛谷P1160 队列安排 链表

洛谷P1160 队列安排   链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std

洛谷 P3367 并查集模板

#include<cstdio> using namespace std; int n,m,p; int father[2000001]; int find(int x) { if(father[x]!=x) father[x]=find(father[x]); return father[x]; } void unionn(int i,int j) { father[j]=i; } int main() { scanf("%d%d",&n,&m); for

[题解]洛谷比赛『期末考后的休闲比赛2』

[前言] 这场比赛已经结束了有几天,但我各种忙,虽然AK但还是没来得及写题解.(我才不会告诉你我跑去学数据结构了) T1 区间方差 (就不贴题好了) 首先可以推公式(我们可以知道,线段树然而并不能通过初中学过的方差公式在log(L)内求出方差): (s2表示方差,L表示区间长度,xi表示区间的每一项,最后一个x上画了一根线表示这些数据的平均数) 用二项式定理完全平方公式可得: 再次展开: 另外,再代入以下这个 得到了: 然后继续吧.. 然后duang地一声合并同类项,于是我们得到了: 然后可以高