slove 6/11
Code:zz
Thinking:zz
贪心即可。这条路线里,点n1和点n2肯定是相连的,接下来,点(n-1)1和点(n-1)2分别是和n1和点n2相连的,一共有两种情况,选择距离短的即可,就这样一直往前贪心。
//#pragma comment(linker, "/STACK:102400000,102400000") #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<string> #include<math.h> #include<cmath> #include<time.h> #include<map> #include<set> #include<vector> #include<queue> #include<algorithm> #include<numeric> #include<stack> #include<bitset> #include<unordered_map> const int maxn = 0x3f3f3f3f; const double EI = 2.71828182845904523536028747135266249775724709369995957496696762772407663035354594571382178525166427; const double PI = 3.141592653589793238462643383279; using namespace std; struct s { long long x1,y1,x2,y2; }z[100010]; inline long long dis(long long x1,long long y1, long long x2,long long y2) { long long z1 = x1 - x2; long long z2 = y1 - y2; if(z1 < 0) { z1 = -z1; } if(z2 < 0) { z2= -z2; } return z1 + z2; } int main(void) { //ios::sync_with_stdio(false); int n,m,i; long long ans; while(~scanf("%d %d",&n,&m)) { for(i = 1;i <= n;i++) { scanf("%lld %lld %lld %lld",&z[i].x1,&z[i].y1,&z[i].x2,&z[i].y2); } //printf("1111\n"); ans = 0; ans += dis(z[n].x1,z[n].y1,z[n].x2,z[n].y2); //printf("2222 %lld\n",ans); for(i = n - 1;i >= 1;i--) { ans += min(dis(z[i].x1,z[i].y1,z[i + 1].x1,z[i + 1].y1) + dis(z[i].x2,z[i].y2,z[i + 1].x2,z[i + 1].y2) ,dis(z[i].x1,z[i].y1,z[i + 1].x2,z[i + 1].y2) + dis(z[i].x2,z[i].y2,z[i + 1].x1,z[i + 1].y1)); /*printf("%d %lld\n",i,min(dis(z[i].x1,z[i].y1,z[i + 1].x1,z[i + 1].y1) + dis(z[i].x2,z[i].y2,z[i + 1].x2,z[i + 1].y2) ,dis(z[i].x1,z[i].y1,z[i + 1].x2,z[i + 1].y2) + dis(z[i].x2,z[i].y2,z[i + 1].x1,z[i + 1].y1)));*/ } printf("%lld\n",ans); } return 0; }