[uva] 301 - Transportation

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=237

这道题真是郁闷, TLE + WA

TLE是因为, 没有做好剪枝, 其中一个剪枝方法是, 假设之后所有的票都选中, 加上之前的利润, 总利润如果还是没有记录的max利润大, 那么就放弃递归, 返回上一层.

WA的原因是脑残, 本来需要一个数组记录各个站点的人数来判断选中当前票是否会超出限额, 我一时短路, 用了一个错误的算法来判断超出限额, 导致WA.

简单死的回溯, 居然犯这么多错误= =...

 1 //
 2 //  main.cpp
 3 //  uva301
 4 //
 5 //  Created by ello on 12/28/13.
 6 //  Copyright (c) 2013 NextLife. All rights reserved.
 7 //
 8 
 9 #include <cstdio>
10 #include <vector>
11 #include <algorithm>
12 using namespace std;
13 
14 int gcn = 0;
15 int gsn = 0;
16 int gon = 0;
17 
18 typedef struct _Order {
19     int start;
20     int end;
21     int pnum;
22     bool select;
23     bool operator < (const struct _Order& order)const {
24         return this->start < order.start;
25     }
26 }Order;
27 
28 bool less_start(const struct _Order& a, const struct _Order& b) {
29     return a < b;
30 }
31 
32 vector<Order> gOrders;
33 vector<int> gStations;
34 int maxEarning = 0;
35 
36 void solve(int cur, int lastEarning) {
37     if (cur == gon) {
38         if (lastEarning > maxEarning) {
39             maxEarning = lastEarning;
40         }
41         return;
42     }
43     
44     int earning = 0;
45     for (unsigned int i = cur; i < gOrders.size(); ++i) {
46         earning += gOrders[i].pnum * (gOrders[i].end - gOrders[i].start);
47     }
48     if (earning + lastEarning <= maxEarning) {
49         return;
50     }
51     
52     gOrders[cur].select = 0;
53     solve(cur + 1, lastEarning);
54     gOrders[cur].select = 1;
55     vector<int> temp = gStations;
56     int flag = 0;
57     for (int i = gOrders[cur].start; i < gOrders[cur].end; ++i) {
58         gStations[i] += gOrders[cur].pnum;
59         if (gStations[i] > gcn) {
60             flag = 1;
61             break;
62         }
63     }
64     if (!flag) {
65         solve(cur + 1, lastEarning + gOrders[cur].pnum * (gOrders[cur].end - gOrders[cur].start));
66     }
67     gStations = temp;
68 }
69 
70 int main(int argc, const char * argv[])
71 {
72     while (scanf("%d%d%d", &gcn, &gsn, &gon) != EOF) {
73         if (gcn == 0 && gsn == 0 && gon == 0) {
74             break;
75         }
76         gOrders.clear();
77         gStations.resize(gsn + 1);
78         maxEarning = 0;
79         for (int i = 0; i < gon; ++i) {
80             Order order;
81             scanf("%d%d%d", &order.start, &order.end, &order.pnum);
82             gOrders.push_back(order);
83         }
84         sort(gOrders.begin(), gOrders.end(), less_start);
85         solve(0, 0);
86         printf("%d\n", maxEarning);
87     }
88     return 0;
89 }

 

posted @ 2014-01-07 01:27  NextLife  阅读(265)  评论(0)    收藏  举报