2012 #5 Gold miner

Gold miner

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1889    Accepted Submission(s): 740
Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status Practice HDU 4341

Problem Description

Homelesser likes playing Gold miners in class. He has to pay much attention to the teacher to avoid being noticed. So he always lose the game. After losing many times, he wants your help.

To make it easy, the gold becomes a point (with the area of 0). You are given each gold‘s position, the time spent to get this gold, and the value of this gold. Maybe some pieces of gold are co-line, you can only get these pieces in order. You can assume it can turn to any direction immediately.
Please help Homelesser get the maximum value.

Input

There are multiple cases.
In each case, the first line contains two integers N (the number of pieces of gold), T (the total time). (0<N≤200, 0≤T≤40000)
In each of the next N lines, there four integers x, y (the position of the gold), t (the time to get this gold), v (the value of this gold). (0≤|x|≤200, 0<y≤200,0<t≤200, 0≤v≤200)

Output

Print the case number and the maximum value for each test case.

Sample Input

3 10
1 1 1 1
2 2 2 2
1 3 15 9
3 10
1 1 13 1
2 2 2 2
1 3 4 7

Sample Output

Case 1: 3
Case 2: 7

Author

HIT

Source

2012 Multi-University Training Contest 5

Recommend

zhuyuanchen520

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <cmath>
  4 #include <algorithm>
  5 using namespace std;
  6
  7 struct Node
  8 {
  9     int x;
 10     int y;
 11     int t;
 12     int v;
 13 }a[205];
 14
 15 bool cmp(Node pp,Node qq)
 16 {
 17     double px,py,qx,qy;
 18     px=(double)pp.x,py=(double)pp.y;
 19     qx=(double)qq.x,qy=(double)qq.y;
 20     if(fabs(atan2(px,py)-atan2(qx,qy))>(1e-8))
 21     {
 22         return atan2(px,py)<atan2(qx,qy);
 23     }
 24     else
 25     {
 26         return (px*px+py*py)<(qx*qx+qy*qy);
 27     }
 28 }
 29
 30 bool compare(Node pp,Node qq)
 31 {
 32     double px,py,qx,qy;
 33     px=(double)pp.x,py=(double)pp.y;
 34     qx=(double)qq.x,qy=(double)qq.y;
 35     if(fabs(atan2(px,py)-atan2(qx,qy))<=(1e-8))
 36         return true;
 37     else
 38         return false;
 39 }
 40
 41 int dp[205][40005],coc[205][40005];
 42
 43 int main()
 44 {
 45     int n,T,cas=1;
 46     int i,j,k;
 47     int b[205];
 48     while(scanf("%d %d",&n,&T)!=EOF)
 49     {
 50         memset(b,0,sizeof(b));
 51         for(i=1;i<=n;i++)
 52             scanf("%d %d %d %d",&a[i].x,&a[i].y,&a[i].t,&a[i].v);
 53         sort(a+1,a+n+1,cmp);
 54         for(i=1;i<n;i++)
 55         {
 56             for(j=i+1;j<=n;j++)
 57             {
 58                 if(compare(a[i],a[j]))
 59                     b[i]++;
 60                 else
 61                     break;
 62             }
 63         }
 64         for(i=0;i<=n;i++)
 65         {
 66             for(j=0;j<=T;j++)
 67             {
 68                 dp[i][j]=0;
 69                 coc[i][j]=0;
 70             }
 71         }
 72
 73         for(i=1;i<=n;i++)
 74         {
 75             for(j=0;j<=T;j++)
 76             {
 77                 dp[i][j]=coc[i][j];
 78             }
 79
 80             for(j=0;j+a[i].t<=T;j++)
 81             {
 82                 dp[i][j+a[i].t]=max(dp[i][j+a[i].t],coc[i][j]+a[i].v);
 83                 if(b[i]>0)
 84                 {
 85                     coc[i+1][j+a[i].t]=max(coc[i+1][j+a[i].t],coc[i][j]+a[i].v);
 86                 }
 87             }
 88
 89             for(j=0;j<=T;j++)
 90             {
 91                 dp[i][j]=max(dp[i-1][j],dp[i][j]);
 92                 coc[i+b[i]+1][j]=max(coc[i+b[i]+1][j],dp[i][j]);
 93             }
 94         }
 95
 96         /*for(i=1;i<=n;i++)
 97             printf("%d ",a[i].v);
 98         printf("\n\n");
 99         for(i=1;i<=n;i++)
100         {
101             for(j=1;j<=T;j++)
102             {
103                 printf("%d ",coc[i][j]);
104             }
105             printf("\n");
106         }
107         printf("\n");
108         for(i=1;i<=n;i++)
109         {
110             for(j=1;j<=T;j++)
111             {
112                 printf("%d ",dp[i][j]);
113             }
114             printf("\n");
115         }
116         printf("\n");*/
117
118         int ans=0;
119             for(j=0;j<=T;j++)
120                 if(dp[n][j]>ans)
121                     ans=dp[n][j];
122         printf("Case %d: %d\n",cas++,ans);
123     }
124     return 0;
125 }

时间: 2024-10-13 03:14:36

2012 #5 Gold miner的相关文章

[USACO 2012 Mar Gold] Large Banner

传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=127 又是一道这种题目,遇到一次跪一次,这次终于硬着头皮看懂了题解,但是谢了代码之后还是wa了3个点(共20个),实在是找不出哪里错了,略烦... 题解真的不想写了,贴个链接叭... http://blog.csdn.net/kanosword/article/details/52585972 这道题比较冷门,官方题解看得不是太懂,上面那个链接讲得比较清楚.

bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】

传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOnline/problem.php?id=2581 这题我一看就知道自己不会了,只想了个O(2^n * 2 ^ n)即O(2 ^ 2n)的大暴力,也懒得打了,果断看solution. 看了之后惊呆了,看到了一种从未见过,闻所未闻的树叫做And-Or Tree,百度了一下,并没有官方中文翻译,姑且叫他"

【HDOJ】4341 Gold miner

分组01背包.在一条直线上的点归为一组. 1 /* 4341 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector> 10 #include <de

HDU 4341 Gold miner

先把线按照距离原点的距离排序,然后用叉积把在同一条直线上的点放在一起, 把在同一条线上的点中的前i个点当成一个点就,就转化成了分组背包. 写if(kas++) putchar('\n') 居然PE了 #include<bits/stdc++.h> using namespace std; int N,T; const int maxn = 203; const int MAXT = 40005; struct Point { int x,y,t,v; }P[maxn]; bool vis[ma

01背包(分组) HDOJ 4341 Gold miner

题目传送门 题意:有n个金矿,每个金矿有抓取的消耗的时间和价值,矿工在原点,问在T时间内能得到的最大的价值 分析:唯一和01背包不同的是金矿可能共线,也就是抓取近的金矿后才能抓后面共线的金矿.这是分组背包问题,方法是将点按照斜率排序,如果相等按照距离原点远近排序,将斜率相等的点分成一组,每组的点累加上前面的点的时间和价值,这样每组只选一个点,就是01背包了 收获:分组背包问题 代码: /************************************************ * Auth

HDU 4341 Gold miner(分组背包)

http://acm.hdu.edu.cn/showproblem.php?pid=4341 题意: 一个人在原点(0,0)抓金子,每块金子是二维坐标平面的一个点(x,y)且y>0. 每块金子有一个价值v和获得需要的时间t.如果多个金子在一条从原点射出的直线上,那只能先抓近的,再抓远的.求在给定时间T下,所能获得的最大价值. 分析: 首先想想如果所有点都不共线是什么情况? 就是在给定时间T内要获取最大的价值和的点, 且所有点都可以任意选取. 那么这就是一个01背包问题. 不过如果存在共线的点,那

HDU 4341 Gold miner 分组背包变形

题意: 挖金矿,人在(0,0)点 n个金子 游戏时间为T 下面n行 (x, y) cost val 且若人 和 多块金子共线时,只能先取最近的金子,依次取,就是和游戏一样的. 且所有点只在1 2象限 思路: 我们先把所有共线的点分组 对于每组的物品,我们都可以认为取这个物品的花费就是前面所有物品的花费总和,而价值就是前面所有物品的价值总和. 这样就能消除每组物品的先取后取的影响了,但有一个情况就是这组至多只能取一个物品,所以每个状态只能是取了这个物品后或者是原始状态. 用原始状态转移,然后和原始

HDU 4341 分组背包

B - Gold miner Time Limit:2000MS Memory Limit:32768KB     Description Homelesser likes playing Gold miners in class. He has to pay much attention to the teacher to avoid being noticed. So he always lose the game. After losing many times, he wants you

[CSP-S模拟测试]:毛一琛(meet in the middle)

题目描述 历史学考后,$MYC$和$ztr$对答案,发现选择题他们没有一道选的是一样的.最后他们都考了个$C$.现在问题来了,假设他们五五开,分数恰好一样(问答题分数也恰好一样,只考虑选择题).已知考题是$N$道选择题(第$i$题分数为$M(i)$).问$ztr$和$MYC$做对的题的并有多少种可能?众所周知,历史学考选择题有$25$题,但是$MYC$为了给你降低难度,$n$不超过$20$. 一句话题意:有多少个非空子集,能划分成和相等的两份. 原题见:$USACO\ 2012\ OPEN\ G