审题:
本题需要我们找出覆盖在目标点上的最上层地毯,并将地毯编号打印出来(编号从1开始)
思路:
方法一:普通枚举
枚举的题需要考虑三个策略:
1.枚举的对象
2.枚举的顺序
3.枚举的方式
本题枚举对象为地毯,顺序为逆序,方式为普通枚举
为什么是逆序枚举?
因为本题只需要我们求出最上层的地毯编号,我们从后面开始判断只需要找成功一次就可以退出循环了,而如果我们从头开始枚举则必定需要将完整的循环进行下去,效率太低
判断成功的依据:
我们先看看题目是如何解释样例1的,他将地毯建立坐标系画出来了。
若我们的x,y分别满足大于左下角坐标的x,y就可以确保该点位于地毯的左下角的右上方
若我们的x,y分别满足大于右上角坐标的x,y就可以确保该点位于地毯的右上角的左下方
从而确保该点被地毯覆盖住
且题目中说了即使地毯覆盖到的坐标处于地毯边缘,也属于覆盖,条件中需要加上等于的情况
特殊处理:如果最后枚举失败,就打印-1
解题:
#include<iostream> using namespace std; int n = 0; const int N = 1e4+10; int a[N],b[N],g[N],k[N]; int x,y; int answer; int main() { cin >> n; int i = 1; while(i <= n) { cin >> a[i] >> b[i] >> g[i] >> k[i]; i++; } cin >> x >> y; for(int j = n; j >= 1; j--) { if(a[j]<=x && b[j]<=y && a[j]+g[j]>=x && b[j]+k[j]>=y)//满足覆盖条件 { answer = j; break; } } if(answer == 0) //没有地毯覆盖到 { cout<<-1; } else { cout << answer; } return 0; }
1.地毯的坐标和长宽等信息我们记录在数组中
2.这里的j就相当于是地毯的编号
算法题(122):铺地毯
最新推荐文章于 2025-05-28 10:48:32 发布