原谅我的懒惰,两道题中间隔了这么久。
这道题乍一看还好,标签枚举,但是一看数据范围,不举了,地毯起点和大小最大十万,数组要400万了,内存直接爆。
仔细读题,要求最上层的地毯,那么被覆盖的地毯没有意义,所以最好的不是当老实人一层一层铺,而是从上往下塞,铺满就停手,当然,实际解题会更偷懒,只要找到目标地毯就停手。先记录所有地毯的数据,之后从顶层开始遍历找目标地毯,判断目标位置在不在当前地毯内,找到就输出结束程序。如果遍历结束还没有找到,则输出-1。
踩了个小坑,地毯数n的范围0≤n≤10000,但是0就是没有地毯,所以地毯的数组a应该从1开始输入,导致提交全错,用了我宝贵的一天一次的下载机会才发现。
粘代码
#include <stdio.h>
int main(){
int n,a[10001][4],i,j,x,y;
scanf("%d",&n);
for(i=1;i<=n;i++){
//从1开始储存地毯
scanf("%d %d %d %d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);
}
//目标位置
scanf("%d %d",&x,&y);
//从最上层检查目标位置在不在地毯内
for(i=n;i>0;i--){
//判断位置,如果在地毯内,则输出当前地毯编号
if(x>=a[i][0]&&x<=(a[i][0]+a[i][2])&&y>=a[i][1]&&y<=(a[i][1]+a[i][3])){
printf("%d",i);
return 0;
}
}
//如果遍历后没找到,输出-1
printf("-1");
return 0;
}
附上第一个检测点
2
45 28 100 100
57 52 92 3
45 28
输出 1