題目鏈接: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
*/