zoukankan      html  css  js  c++  java
  • Monument Tour(以前月赛卡住的签到题,今天突然想起拿出来补一补

    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;
    }
    
  • 相关阅读:
    js每天进步一点点
    优化数据库的方法及SQL语句优化的原则
    实用js代码大全
    【怒转】 idea快捷键说明大全(中英文对照)
    正则表达式手册
    Flink分布式缓存Distributed Cache
    初识Flink广播变量broadcast
    怒转一波,此人整理的Flink特别好
    flink批处理中的source以及sink介绍
    初识Flink-从WorldCount开始
  • 原文地址:https://www.cnblogs.com/wzgg/p/11489279.html
Copyright © 2011-2022 走看看