poj1040 Transportation

Posted ColdCode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1040 Transportation相关的知识,希望对你有一定的参考价值。

题目链接

http://poj.org/problem?id=1040

题意

城市A,B之间有m+1个火车站,第一站A站的编号为0,最后一站B站的编号为m,火车最多可以乘坐n人。火车票的票价为票上终点站的编号减去起点站的编号。输入火车票订单的数目orderNums,接着输入orderNums个订单,每个订单由3个数字s,e,p组成,分别表示订单的起点站,终点站,该订单的人数,必须全部接受订单上的乘客或者全部不接受,求铁路公司最多可以赚多少钱。

思路

对于一个订单来说,有两种情况:接受和不接受。我们只需将所有可能的情况枚举出来,然后求在每一种情况下,铁路公司所赚的钱的最大值即可,这种枚举很适合使用dfs来解决。为了简化求解,我们要保证乘客是按火车站的编号顺序来上车,所以要将订单按订单起点的编号从低到高排序,若起点相同,则按终点编号从低到高排序。

代码

 

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <vector>
 6 using namespace std;
 7 
 8 struct Order
 9 {
10     int s;  //起点
11     int e;  //终点
12     int p;  //人数
13 
14     Order(int s, int e, int p):s(s), e(e), p(p){}
15 };
16 
17 bool cmp(Order o1, Order o2)    //将订单排序
18 {
19     if(o1.s==o2.s)
20         return o1.e<o2.e;
21     return o1.s<o2.s;
22 }
23 
24 const int N = 10;
25 vector<Order> orders;
26 int n, m, orderNums;
27 int down[N];    //down[i]表示第i站下车的人数
28 int ans;
29 
30 void print(vector<Order> v)
31 {
32     for(int i=0; i<v.size(); i++)
33         cout<<v[i].s<<" "<<v[i].e<<" "<<v[i].p<<endl;
34     cout<<endl;
35 }
36 
37 /*
38 * p : 当前车上的人数
39 * cur : 火车当前在第cur站
40 * sum : 当前赚的钱数
41 */
42 void dfs(int p, int cur, int sum)
43 {
44     if(cur==orderNums)
45     {
46         ans = max(ans, sum);
47         return;
48     }
49 
50     if(cur>0)   //当前站不是第一站A
51     {
52         for(int i=orders[cur-1].s+1; i<=orders[cur].s; i++)
53             p-=down[i]; //减去下车的人数
54     }
55     if(p+orders[cur].p <= n)
56     {
57         down[orders[cur].e] += orders[cur].p;
58         dfs(p+orders[cur].p, cur+1, sum + (orders[cur].e-orders[cur].s)*orders[cur].p);
59         down[orders[cur].e] -= orders[cur].p;   //注意恢复现场,便于回溯
60     }
61     dfs(p, cur+1, sum);
62 }
63 
64 int main()
65 {
66     //freopen("poj1040.txt", "r", stdin);
67     while(cin>>n>>m>>orderNums && n)
68     {
69         ans = -1;
70         orders.clear();
71         memset(down, 0, sizeof(down));
72         for(int i=0; i<orderNums; i++)
73         {
74             int s, e, p;
75             cin>>s>>e>>p;
76             orders.push_back(Order(s, e, p));
77         }
78 
79         sort(orders.begin(), orders.end(), cmp);
80         dfs(0, 0, 0);
81         cout<<ans<<endl;
82     }
83     return 0;
84 }

 

以上是关于poj1040 Transportation的主要内容,如果未能解决你的问题,请参考以下文章

最短路/最大生成树POJ 1797 Heavy Transportation

POJ 1797 Heavy Transportation

poj 1797 Heavy Transportation

POJ 1797 Heavy Transportation (Dijkstra)

POJ-1797 Heavy Transportation( 最短路 )

POJ 1797 Heavy Transportation