当前位置: 代码迷 >> 综合 >> CCPC-Wannafly Winter Camp Day4 (Div2)
  详细解决方案

CCPC-Wannafly Winter Camp Day4 (Div2)

热度:6   发布时间:2023-12-26 09:48:15.0

A 夺宝奇兵(思维)

【分析】题意就是,有n类点,每类点有两个,要求从点1依次走到点n,再从点n依次走到点1的距离最小值。只能沿着网格线走,并且走到某点可以不选取该点的;

因为走到第n个点时,下一个必然走的是n类点的第二个点。那么就从第n类点的两个点往前走,求n1、n2和(n-1)1、(n-1)2这两类点距离的最小值即可;

【代码】( 做得时候不是我A的...现在也不能补题。也不知道代码会不会哪里有问题...先挂上吧

#include<cstdio>
#include<iostream> 
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;typedef long long ll;
const int maxn=1e5+10;
struct node{int x[2],y[2];
}point[maxn];ll getdis(ll x1,ll y1,ll x2,ll y2)
{return fabs(x1-x2)+fabs(y1-y2);
}int  main()
{int n,m;scanf("%d%d",&n,&m);for(int i=0;i<n;i++)scanf("%d%d%d%d",&point[i].x[0],&point[i].y[0],&point[i].x[1],&point[i].y[1]);int ans=getdis(point[n-1].x[0],point[n-1].y[0],point[n-1].x[1],point[n-1].y[1]);for(int i=1;i<n;i++){int x1=point[n-i].x[0],y1=point[n-i].y[0];int x2=point[n-i].x[1],y2=point[n-i].y[1];ll f1=getdis(x1,y1,point[n-i-1].x[0],point[n-i-1].y[0]);//4-1 + 3-1ll f2=getdis(x1,y1,point[n-i-1].x[1],point[n-i-1].y[1]);//4-1 + 3-2ll f3=getdis(x2,y2,point[n-i-1].x[0],point[n-i-1].y[0]);//4-2 + 3-1ll f4=getdis(x2,y2,point[n-i-1].x[1],point[n-i-1].y[1]);//4-2 + 3-2ans+=min(f1+f4,f2+f3);	}cout<<ans<<endl;
}

 

  相关解决方案