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 }

转载于:https://www.cnblogs.com/devtang/archive/2012/08/09/2630788.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值