洛谷P1003[NOIP 2011 提高组] 铺地毯
解题思路:题目要求我们找的是能覆盖在所求坐标的最上面的地毯,而地毯的铺设方式是按照编号从小到大铺设,故我们从第一张地毯开始枚举即可,而覆盖的符合条件就是所求坐标的横坐标在a~a+g,同时纵坐标在b~b+k,我们可以先设置一个索引index,用于记录当前所求的地毯编号,当我们每枚举出一种合法的覆盖方式(即地毯满足上述覆盖方式)我们就可更新索引,当枚举结束,我们可对index进行特判,再完成题目输出,当然,因为这题找的是能覆盖在所求坐标的最上面的地毯,我们也可从最后一张地毯开始往前枚举,如果找到第一张符合条件的地毯,其编号即为答案,此题我们采用模拟即第一种方式来解决。
#include<bits/stdc++.h>
using namespace std;
int main()
{int n;cin >> n;int index=-1;//设置一个索引并初始化为-1vector<pair<int,int>>digits(n);//开一个复合数据类型数组,记录地毯的左下角坐标vector<int>xx(n),yy(n);//记录坐标沿x轴方向的长度,沿y轴方向的长度for(int i=0;i<n;i++){int a,b,g,k;cin >> a >> b >> g >> k;//完成输入digits[i].first=a;//存储坐标信息digits[i].second=b;//存储坐标信息xx[i]=g;//存储此张地毯沿x轴方向的长度yy[i]=k;//存储此张地毯沿y轴方向的长度}int x,y;cin >> x >> y;//目标坐标for(int i=0;i<n;i++)//枚举所有地毯{if(x>=digits[i].first&&x<=digits[i].first+xx[i])//判断目标坐标的横坐标是否符合条件{if(y>=digits[i].second&&y<=digits[i].second+yy[i])判断目标坐标的纵坐标是否符合条件{index=i+1;//如果都符合条件,说明目标坐标是被这张地毯覆盖的,我们就可更新索引,记录下地毯编号} //因为i是从0开始,所有i+1是地毯编号}}if(index!=-1) cout << index << endl;//如果索引不为-1,说明至少找到了一张符合条件的地毯,我们else cout << -1 << endl; //直接输出答案
} //否则输出-1,表示没找到