题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2460
题意不表
题目感想:虽然是简单题吧,但是由于是算法思维和代码能力的练习,所以把它补了,这题的思维真的类似于数字三角形那题,就是逆推dp思想,逆推逆推!校赛两道题都是这个思想,也是一个教训,而且对于每一个算法的理解基础真的要到位,另外还是把题目思路想清楚,再动键盘,真是白给一发。
#include<bits/stdc++.h>
using namespace std;
int t,n;
const int maxn = 1e3+9;
struct node{
int x,y,z;
double ans=0.0;
friend bool operator <(node a,node b){
return a.z<b.z;
}
}a[maxn];
int main()
{
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
}
sort(a+1,a+n+1);
vector<node>v[maxn];
int num=0;a[0].z=-99999;
for(int i=1;i<=n;i++){
if(a[i].z!=a[i-1].z){
v[++num].push_back(a[i]);
}
else{
v[num].push_back(a[i]);
}
}
for(int i=1;i<num;i++){
for(int k=0;k<v[i+1].size();k++){
double q[maxn];int cnt=0;
for(int j=0;j<v[i].size();j++){
int a=v[i][j].x,b=v[i][j].y,c=v[i][j].z;
int a1=v[i+1][k].x,b1=v[i+1][k].y,c1=v[i+1][k].z;
double temp=sqrt((double)(a1-a)*(a1-a)+(b1-b)*(b1-b)+(c1-c)*(c1-c));
q[cnt++]=temp+v[i][j].ans;
}
sort(q,q+cnt);
v[i+1][k].ans=q[cnt-1];
}
}
double ans=0;
for(int i=0;i<v[num].size();i++){
ans=max(v[num][i].ans,ans);
}
printf("%.3f\n",ans);
}
return 0;
}
/*
3
7
0 1 1
0 0 0
0 1 0
0 100 0
0 1000 0
0 1000 1
0 1000 2
*/