您的位置:首页 > 编程语言 > Go语言

2012 #5 Gold miner

2015-08-30 19:42 483 查看

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

[align=left]Problem Description[/align]
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.

#include <stdio.h>
#include <string.h>
#include <cmath>
#include <algorithm>
using namespace std;

struct Node
{
int x;
int y;
int t;
int v;
}a[205];

bool cmp(Node pp,Node qq)
{
double px,py,qx,qy;
px=(double)pp.x,py=(double)pp.y;
qx=(double)qq.x,qy=(double)qq.y;
if(fabs(atan2(px,py)-atan2(qx,qy))>(1e-8))
{
return atan2(px,py)<atan2(qx,qy);
}
else
{
return (px*px+py*py)<(qx*qx+qy*qy);
}
}

bool compare(Node pp,Node qq)
{
double px,py,qx,qy;
px=(double)pp.x,py=(double)pp.y;
qx=(double)qq.x,qy=(double)qq.y;
if(fabs(atan2(px,py)-atan2(qx,qy))<=(1e-8))
return true;
else
return false;
}

int dp[205][40005],coc[205][40005];

int main()
{
int n,T,cas=1;
int i,j,k;
int b[205];
while(scanf("%d %d",&n,&T)!=EOF)
{
memset(b,0,sizeof(b));
for(i=1;i<=n;i++)
scanf("%d %d %d %d",&a[i].x,&a[i].y,&a[i].t,&a[i].v);
sort(a+1,a+n+1,cmp);
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(compare(a[i],a[j]))
b[i]++;
else
break;
}
}
for(i=0;i<=n;i++)
{
for(j=0;j<=T;j++)
{
dp[i][j]=0;
coc[i][j]=0;
}
}

for(i=1;i<=n;i++)
{
for(j=0;j<=T;j++)
{
dp[i][j]=coc[i][j];
}

for(j=0;j+a[i].t<=T;j++)
{
dp[i][j+a[i].t]=max(dp[i][j+a[i].t],coc[i][j]+a[i].v);
if(b[i]>0)
{
coc[i+1][j+a[i].t]=max(coc[i+1][j+a[i].t],coc[i][j]+a[i].v);
}
}

for(j=0;j<=T;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i][j]);
coc[i+b[i]+1][j]=max(coc[i+b[i]+1][j],dp[i][j]);
}
}

/*for(i=1;i<=n;i++)
printf("%d ",a[i].v);
printf("\n\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=T;j++)
{
printf("%d ",coc[i][j]);
}
printf("\n");
}
printf("\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=T;j++)
{
printf("%d ",dp[i][j]);
}
printf("\n");
}
printf("\n");*/

int ans=0;
for(j=0;j<=T;j++)
if(dp
[j]>ans)
ans=dp
[j];
printf("Case %d: %d\n",cas++,ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: