HDU 6343

超时代码:

#include <iostream>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int w[100010];
struct Node{
    int n,length;
    Node(int n){
        this -> n = n;
        length = sqrt(w[n] - 1) ;
    }
    operator < (const Node& b) const{
        return length > b.length;
    }
};
int main()
{
    int t,n,T[100010],dist[100010];

    cin >> t;
    priority_queue<Node> q;
    while(t--){
        memset(T,0,sizeof(T));
        while(!q.empty()){
            q.pop();
        }
        scanf("%d",&n);
        for(int i = 1; i <= n; i++){
            scanf("%d",&w[i]);
        }
         dist[1] = 0;
        Node node(1);
        q.push(node);
        while(!q.empty()){
            node = q.top(); q.pop();
            if(T[node.n]) continue;
            T[node.n] = 1;
            dist[node.n] = node.length;
            if(node.n != n){
                for(int i = n; i >= 1; i--){
                    if(T[i]) continue;
                    Node tmp(i);
                    tmp.length = min(tmp.length,node.length + (int) sqrt((abs(w[node.n] - w[i] ) ) ));
                    q.push(tmp);

                }
            }
            else break;
        }
        printf("%d\n",dist[n]);
    }
    return 0;
}

其实是道数学题。。。。。

#include <iostream>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int w[100010];
int main()
{
    int t,n;

    cin >> t;
    while(t--){
        scanf("%d",&n);
        for(int i = 1; i <= n; i++){
            scanf("%d",&w[i]);
        }

        printf("%d\n",(int)sqrt(abs(w[n] - w[1])));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ehdhg13455/article/details/81484234
hdu