超时代码:
#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;
}