Description du titre
Il y a N villes sur la carte. Une vache doit passer par N villes dans l'ordre de la ville 1 et finalement atteindre la ville N. Mais la vache pensait que c'était trop ennuyeux, elle a donc décidé de sauter l'une des villes (mais pas les villes 1 et N) pour qu'elle parte de la ville 1 et ait la plus petite distance totale pour atteindre la ville N . Chaque ville a une coordonnée et la distance de la ville (x1, y1) à la ville (x2, y2) est | x1-x2 | + | y1-y2 |.
Entrée
La première ligne a un nombre N, ce qui signifie le nombre de villes. La
ligne suivante N a deux nombres x, y, ce qui signifie les coordonnées de chaque ville.
Sortie
Comptez ans sur une ligne, de sorte qu'il commence à partir de la ville 1, saute une certaine ville et que la distance totale pour atteindre la ville N soit la plus petite
Exemple d'entrée
4
0 0
8 3
11 -1
10 0
Exemple de sortie
14
Limitation de la plage de données
• Pour 40% des données, N <= 1000.
• Pour des données à 100%, 3 <= N <= 10 5 , -10 3 <= x <= 10 3 , -10 3 <= y <= 10 3 .
Rapide
Sauter la ville 2.
Analyse
Sujet: En fait, c'est un processus de «construction de ponts» et de «rupture de ponts». Trouvez d'abord la distance, additionnez, puis énumérez chaque point comme le point à ignorer, soustrayez la distance de x-1 ~ x et x x + 1, puis ajoutez la distance de x-1 x + 1, appuyez sur Une bague suffit.
Code sur
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
long long n,ans=922337203685477,ff;
long long a[100010],b[100010];//记得longlong
int main()
{
freopen("marathon.in","r",stdin);
freopen("marathon.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
if(i>=2) ff=ff+abs(a[i]-a[i-1])+abs(b[i]-b[i-1]);//统计总长度
}
for(int i=2;i<=n-1;i++)
{
ans=min(ans,ff-abs(a[i]-a[i-1])-abs(b[i]-b[i-1])-abs(a[i]-a[i+1])-
abs(b[i]-b[i+1])+abs(a[i-1]-a[i+1])+abs(b[i-1]-b[i+1]));//拆桥搭桥
}
cout<<ans;
return 0;
}