Monument Tour(以前月赛卡住的签到题,今天突然想起拿出来补一补
https://oj.neu.edu.cn/problem/1501
题意:给你矩阵大小和上面的一些点,要你从左到右从一条主路穿过,并且访问这些点,问最短总路线长度。
思路:一开始对于一个点我只算了一次,其实应该把它当成长度为0的线段,然后所有点可以转化成若干条线段,将所有线段的端点纵坐标扔到数组里,排序取中位数就是主路的纵坐标,然后每条线段的贡献是线段长+两点到主路的距离之和。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #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; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步