CF1044C题解
题目大意:
给你 个在平面直角坐标系内的点,然后求出 边形的最大周长,任意两点间距离为曼哈顿距离。
题目分析:
显而易见,因为距离为曼哈顿距离,所以题目要求的东西就变成了由多个点组成的矩形的周长。
举个例子,如下图,假设我们选择这样四个点:
那么我们要求的矩形长这样:
得到了这个以后,我们还需要分三种情况考虑:
1. 当 时即我们要求的是一个非三角形的最大周长时,这时就直接取横纵坐标的最大差值求和作为答案就行了。
这个的正确性显然,因为当我们求个非三角形时,就一定能取至少四个点,那么这时,我们一定能保证取到最大的差值。
2. 当 时即我们要求的是一个三角形的最大周长时,这时我们就无法像上面那样考虑,样例一就是一个例子。
所以,这个时候我们可以直接枚举求解。
注:
看到数据范围 一定要记得开 long long。
这里给出核心部分代码:
int main() { n=read(); long long maxx=-1,minx=0x7f7f7f; long long maxy=-1,miny=0x7f7f7f; for(register int i=1;i<=n;i++) { x[i]=read(),y[i]=read(); maxx=max(maxx,x[i]); minx=min(minx,x[i]); maxy=max(maxy,y[i]); miny=min(miny,y[i]); } long long sum=(maxx-minx+maxy-miny)*2; if(n==3) { cout<<sum; return 0; } for(register int i=1;i<=n;i++) { if(x[i]==maxx) a[1]=x[i],b[1]=y[i]; if(x[i]==minx) a[2]=x[i],b[2]=y[i]; if(y[i]==maxy) a[3]=x[i],b[3]=y[i]; if(y[i]==miny) a[4]=x[i],b[4]=y[i]; } long long maxn=0; for(register int i=1;i<=n;i++) { maxn=max(maxn,abs(x[i]-minx)+abs(y[i]-miny)); maxn=max(maxn,abs(x[i]-minx)+abs(y[i]-maxy)); maxn=max(maxn,abs(x[i]-maxx)+abs(y[i]-maxy)); maxn=max(maxn,abs(x[i]-maxx)+abs(y[i]-miny)); } cout<<maxn*2<<' '; for(register int i=4;i<=n;i++) { cout<<sum<<' '; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】