slove 6/11

 

A.夺宝奇兵

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;
}
View Code

相关文章: