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 (Dijkstra)