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 }