#include<bits/stdc++.h>
using namespace std;
const int mx=1000+100;
typedef long long ll;
const ll INF =10000000000000;
int T,n;
ll sum[mx],dp[mx][mx];
struct JZT
{
ll x,y,ex,w;
}a[mx];
bool cmp(const JZT &f,const JZT &s)
{
if(f.ex==s.ex)
return f.x>s.x;
return f.ex<s.ex;
}
ll cal(int f,int s)
{
ll l=a[s].x+a[s].y-(a[f].x-a[f].y);
if(l<=0) return 0;
return l*l;
}
int main()
{
cin>>T;
int kase=0;
while(T--)
{
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].w);
a[i].w*=4;
a[i].ex=a[i].x+a[i].y;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) dp[i][j]=-INF;
for(int i=0;i<n;i++) dp[i][i]=a[i].w-a[i].y*4*a[i].y;
for(int i=0;i<n;i++)
{
for(int j=i-1;j>=0;j--)
{
if(a[i].x-a[i].y<=a[j].x-a[j].y) dp[i][i]+=a[j].w;
else
dp[i][j]=dp[j][j]+dp[i][i]+cal(i,j);
}
for(int j=0;j<i;j++) dp[i][i]=max(dp[i][i],dp[i][j]);
}
ll res=dp[0][0];
for(int i=0;i<n;i++) res=max(res,dp[i][i]);
printf("Case #%d: %lld",++kase,res/4);
if(res%4==0) printf(".00\n");
else if (res%4==1) printf(".25\n");
else if(res%4==2) printf(".50\n");
else printf(".75\n");
}
}
hihocoder 1157 : 建造金字塔
最新推荐文章于 2024-01-09 16:19:17 发布