码迷,mamicode.com
首页 > 其他好文 > 详细

Monument Tour(以前月赛卡住的签到题,今天突然想起拿出来补一补

时间:2019-09-08 23:57:57      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:大小   return   距离   今天   pac   +=   mon   转化   ace   

https://oj.neu.edu.cn/problem/1501

题意:给你矩阵大小和上面的一些点,要你从左到右从一条主路穿过,并且访问这些点,问最短总路线长度。

思路:一开始对于一个点我只算了一次,其实应该把它当成长度为0的线段,然后所有点可以转化成若干条线段,将所有线段的端点纵坐标扔到数组里,排序取中位数就是主路的纵坐标,然后每条线段的贡献是线段长+两点到主路的距离之和。

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int maxn = 200010;
int X,Y;
struct point {
    int x,y;
}p[maxn];
int ma[maxn],mi[maxn],aim[maxn];
bool cmp(point a,point b){
    return a.y<b.y;
}

signed main(){
    while(cin>>X>>Y){
        memset(p,0,sizeof p);
        memset(ma,-1,sizeof ma);
        memset(mi,0x3f,sizeof mi);
        memset(aim,0,sizeof aim);
        int n,x,y;
        cin>>n;
        int pos = 0;
        for(int i=0;i<n;i++){
            cin>>p[i].x>>p[i].y;
            ma[p[i].x] = max(ma[p[i].x],p[i].y);
            mi[p[i].x] = min(mi[p[i].x],p[i].y);
        }
        int cnt = 0;
        for(int i=0;i<100003;i++){
            if(ma[i]!=-1&&mi[i]!=0x3f3f3f3f){
                aim[cnt++] = ma[i];
                aim[cnt++] = mi[i];
            }
        }
        sort(aim,aim+cnt);
        int mid = aim[(cnt-1)/2];
        int ans = X-1;
        for(int i=0;i<100003;i++){
            if(ma[i]!=-1&&mi[i]!=0x3f3f3f3f){
                ans += ma[i]-mi[i]+abs(mid-ma[i])+abs(mid-mi[i]);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

Monument Tour(以前月赛卡住的签到题,今天突然想起拿出来补一补

标签:大小   return   距离   今天   pac   +=   mon   转化   ace   

原文地址:https://www.cnblogs.com/wzgg/p/11489279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!