T4

题目描述

约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西. 
约翰发现,如果要使这群有洁癖的奶牛满意,他不得不雇佣她们中的一些来清扫牛棚, 约翰的奶牛中有N(1≤N≤10000)头愿意通过清扫牛棚来挣一些零花钱. 
由于在某个时段中奶牛们会在牛棚里随时随地地乱扔垃圾,自然地,她们要求在这段时间里,无论什么时候至少要有一头奶牛正在打扫. 
需要打扫的时段从某一天的第M秒开始,到第E秒结束f0≤M≤E≤86399).注意这里的秒是指时间段而不是时间点,也就是说,每天需要打扫的总时间是E-M+I秒.  
约翰已经从每头牛那里得到了她们愿意接受的工作计划:对于某一头牛,她每天都愿意在笫T1...T2秒的时间段内工作 (where M <= T1 <= T2 <= E),所要求的报酬是S美元(0≤S≤500000).与需打扫时段的描述一样,如果一头奶牛愿意工作的时段是每天的第10_20秒,那她总共工作的时间是11秒,而不是10秒.约翰一旦决定雇佣某一头奶牛,就必须付给她全额的工资,而不能只让她工作一段时间,然后再按这段时间在她愿意工作的总时间中所占的百分比来决定她的工资.现在请你帮约翰决定该雇佣哪些奶牛以保持牛棚的清洁,当然,在能让奶牛们满意的前提下,约翰希望使总花费尽量小。 

输入

第1行:3个正整数N,M,E,用空格隔开.  
第2到N+1行:第i+l行给出了编号为i的奶牛的工作计划,即3个用空格隔开的正整数Ti,T2,S。 

输出

输出一个整数,表示约翰需要为牛棚清理工作支付的最少费用.如果清理工作不可能完成,那么输出-1.

样例输入 Copy

3 0 4
0 2 3
3 4 2
0 0 1

样例输出 Copy

5

提示

约翰有3头牛,牛棚在第0秒到第4秒之间需要打扫.第1头牛想要在第0,1,2秒内工作,为此她要求的报酬是3美元.其余的依此类推. 约翰雇佣前两头牛清扫牛棚,可以只花5美元就完成一整天的清扫.

思路:

这题看上去第一眼,看到了最小花费,第一反应,网络流?DP?还是蓝的?

在一看看这不是最短路吗,还几乎是裸的,把时间当节点,奶牛的工资当花费,唯一要注意的就是要把i和i-1连一条边,费用为0这样可以让一头牛可以不工作完。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <queue>
 6 using namespace std;
 7 const int maxn=1e6+10;
 8 const int inf=0x7fffffff;
 9 int head[maxn];
10 int tot=0;
11 bool vis[maxn];
12 int dis[maxn];
13 int n,m,d,k;
14 
15 queue<int >q;
16 int e;
17 struct node
18 {
19     int next;
20     int to;
21     long long len;
22 }way[maxn];
23 
24 int add(int x,int y,int w)
25 {
26     way[++tot].next=head[x];
27     way[tot].to=y;
28     way[tot].len=w;
29     head[x]=tot;
30 }
31 
32 int spfa()
33 {
34     q.push(m);
35     dis[m]=0;
36     vis[m]=true;
37     while(!q.empty())
38     {
39         int x=q.front();
40         q.pop();
41         vis[x]=false;
42         for(int i=head[x];i;i=way[i].next)
43         {
44             int to=way[i].to;
45             if(dis[x]+way[i].len<dis[to])
46             {
47                 dis[to]=dis[x]+way[i].len;
48                 if(!vis[to])
49                 {
50                     q.push(to);
51                     vis[to]=true;
52                 }
53             }
54         }
55     }
56 }
57 int main()
58 {
59     cin>>n>>m>>e;
60     memset(head,0,sizeof(head));
61     memset(vis,false,sizeof(vis));
62     e++;
63     for(int i=1;i<=n;i++)
64     {
65         int x;
66         int y;
67         int w;
68         cin>>x>>y>>w;
69         y++;
70         add(x,y,w);    
71     }
72     for(int i=m;i<=e-1;i++)
73     {
74         add(i+1,i,0);
75     }
76     for(int i=m;i<=e;i++)
77     {
78         dis[i]=inf;
79     }
80     spfa();
81     if(dis[e]==inf)
82     {
83         cout<<-1<<endl;
84     }
85     else
86     cout<<dis[e]<<endl;
87 }
原文地址:https://www.cnblogs.com/2529102757ab/p/10964016.html