HDU 4341

View Code
 1 #include<iostream>

 2 #include<set>

 3 #include<cstdio>

 4 #include<cmath>

 5 #include<vector>

 6 #include<algorithm>

 7 #define MAXN 40004

 8 using namespace std;

 9 typedef long long int ll;

10 int dp[MAXN];

11 struct point {

12      int x,y;

13      int val,t;

14      point(){}

15      point(int _x, int _y, int _t, int _val):x(_x),y(_y),t(_t),val(_val){};       

16 };

17 point start(0,0,0,0);

18 

19 int dis2(const point &p, const point &q)

20 {

21     return (p.x - q.x)*(p.x - q.x) + (p.y - q.y)*(p.y - q.y);

22 }

23 

24 int cross(const point &p1, const point &p2, const point &q1, const point &q2)

25 {

26     return (q2.y - q1.y)*(p2.x - p1.x) - (q2.x - q1.x)*(p2.y - p1.y);

27 }

28 

29 bool cmp(const point &p, const point &q)

30 {

31     return cross(start,p,start,q) > 0 || (cross(start,p,start,q) == 0 && dis2(start,p) < dis2(start,q));      

32 }

33 

34 int main()

35 {

36     int n,t;

37     int cnt(1);

38     while (scanf("%d%d",&n,&t) != EOF) {

39        cout<<"Case "<<cnt++<<": ";

40        memset(dp,0,sizeof(dp));

41        vector<point> data;

42        vector<point> gold;

43        point temp;

44        for (int i(0); i<n; ++i) {

45            scanf("%d%d%d%d",&temp.x,&temp.y,&temp.t,&temp.val);

46            gold.push_back(temp);    

47        }         

48        sort(gold.begin(),gold.end(),cmp);

49        data.push_back(gold[0]);

50        

51        for (int i(1); i<gold.size() || !data.empty(); ++i) {                

52            if ((i >= gold.size() && !data.empty()) || cross(start,gold[i],start,gold[i-1]) != 0) {

53               for (int j(t); j>=0; --j) {

54                   for (int k(0); k<data.size(); ++k) {

55                       if (j - data[k].t >= 0) {

56                          dp[j] = max(dp[j],dp[j-data[k].t] + data[k].val);      

57                       }    

58                   }    

59               }                  

60               data.clear();

61               if (i < gold.size())data.push_back(gold[i]);

62            } else {

63              if (cross(start,gold[i],start,gold[i-1]) == 0) {

64                 gold[i].val += gold[i-1].val;

65                 gold[i].t += gold[i-1].t;

66                 data.push_back(gold[i]);                                         

67              }       

68            }

69        }

70        cout<<dp[t]<<endl;       

71     }

72     return 0;    

73 }

你可能感兴趣的:(HDU)