hrbust2460.三維空間的移動方式

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章