

说实话题解和视频题解都不太好,有点过于复杂了,那就不得不记录一下我看视频题解衍生出的另一个较为简单的思路了。
根据答案形态出发,枚举所有这种形态找出最大值。

可以发现最大的泳池要么是左右边界被两棵树限制住了,或者就是上下边界被两棵树限制住了。
所以我们可以穷举所有两棵树的组合,并且以这两棵树y的差值或者x的差值为正方形的边长,来放下泳池。最大的泳池,必然在这些组合里面。
放下泳池有限制条件,假设以y的差值放下去,那么可用的连续x也必须大于等于y的差值,两棵树之间可能会有其他树来碍事,那么这里的x就会被断开成好几段,需要找出最大的那个x。
这种只有一棵树的
,因为泳池不能超过边界,所以相当于外面围了一圈树,只要在四个角落种上树就好了。
AC代码
- #include
- using namespace std;
-
- int N,T,ans=INT_MIN;
- struct tree{
- int x,y;
- }t[105];
- vector<int>tmp;
- bool cmpy(tree a,tree b){
- return a.y
- }
- bool cmpx(tree a,tree b){
- return a.x
- }
-
- int main(){
- cin>>N>>T;
- for(int i=1;i<=T;++i)
- cin>>t[i].x>>t[i].y;
-
- t[++T]={0,0};
- t[++T]={0,N+1};
- t[++T]={N+1,0};
- t[++T]={N+1,N+1};
-
- sort(t+1,t+1+T,cmpy);
- for(int i=1;i<=T;++i){
- for(int j=i+1;j<=T;++j){
- tmp.push_back(0);
- tmp.push_back(N+1);
- for(int k=i+1;k
- tmp.push_back(t[k].x);
-
- sort(tmp.begin(),tmp.end());
- int xmax=INT_MIN;
- for(int k=0;k
size()-1;++k) - xmax=max(xmax,tmp[k+1]-tmp[k]-1);
- ans=max(ans,min(xmax,t[j].y-t[i].y-1));
- tmp.clear();
- }
- }
-
- sort(t+1,t+1+T,cmpx);
- for(int i=1;i<=T;++i){
- for(int j=i+1;j<=T;++j){
- tmp.push_back(0);
- tmp.push_back(N+1);
- for(int k=i+1;k
- tmp.push_back(t[k].y);
-
- sort(tmp.begin(),tmp.end());
- int ymax=INT_MIN;
- for(int k=0;k
size()-1;++k) - ymax=max(ymax,tmp[k+1]-tmp[k]-1);
- ans=max(ans,min(ymax,t[j].x-t[i].x-1));
- tmp.clear();
- }
- }
-
- cout<
- return 0;
- }
思路很简单,但是说也不太说的明白。
重点:枚举所有答案形态。
-
相关阅读:
计网ppt标黄知识点整理第(4)章节——谢希仁版本、期末复习自用
Swift开发——元组
C/C++教程 从入门到精通《第十一章》——初识MFC
Arm64 linux Virtual memory分析
纯前端实现 导入 与 导出 Excel
消息队列实现进程之间通信方式代码,现象
集合框架——LinkedList集合源码分析
QGraphicsItem图元坐标和在场景中的坐标(六)
docker搭建redis多主多从策略
【Linux命令】vim 多模式编辑
-
原文地址:https://blog.csdn.net/qq_17807067/article/details/133889689