题解 P1003 【铺地毯】
题目描述
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 nn 张地毯,编号从 11 到nn。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
输入输出格式
输入格式:
输入共n+2n+2行
第一行,一个整数nn,表示总共有nn张地毯
接下来的nn行中,第 i+1i+1行表示编号ii的地毯的信息,包含四个正整数a ,b ,g ,ka,b,g,k ,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)(a,b)以及地毯在xx轴和yy轴方向的长度
第n+2n+2行包含两个正整数xx和yy,表示所求的地面的点的坐标(x,y)(x,y)
输出格式:
输出共11行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1−1
输入输出样例
输入样例#1:
3
1 0 2 3
0 2 3 3
2 1 3 3
2 2
输出样例#1:
3
输入样例#2:
3
1 0 2 3
0 2 3 3
2 1 3 3
4 5
输出样例#2:
首先,看50分的,范围100. 所以我们可以十分暴力的进行二维模拟
50分code
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 500
using namespace std ;
int n ;int x , y , xx , yy ;
int f[maxn][maxn] ;
int main(){
scanf("%d",&n) ;
for(int i = 1 ; i <= n ; i ++){
scanf("%d%d%d%d",&x,&y,&xx,&yy) ;
for(int j = x ; j <= x + xx ; j ++ )
for(int k = y ; k <= y + yy ; k ++ ){
f[j][k] = i ;
}
}
int a , b ;
cin >> a >> b ;
if(f[a][b]){
cout << f[a][b] ;
}else
cout << -1 ;
return 0 ;
}
但是,作为day1t1,的50分是远远不够的
于是,我们就可以进行一下别的思路
我们可以通过结构体的帮助来将其变为一维的
定义一个叫做carpet的struct 内有x1,x2,y1,y2,num五个变量 分别表示x起点,x终点,y起点,y终点,以及地毯的编号
存好之后,吧编号从大到小排序,如果目标点在当前地毯中,就break掉
否则,就愉快的输出-1
ACcode
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std ;
struct dy{//说好的carpet呢!!!
int x1,x2,y1,y2,num ;
}a[10010];
int n , m ;
int x , xx , y , yy ;
int cmp(dy x , dy y){
return x.num > y.num ;
}
int main(){
scanf("%d",&n) ;
for(int i = 1 ; i <= n ; i ++){
scanf("%d%d%d%d",&x,&y,&xx,&yy) ;
a[i].x1 = x ;//x起点
a[i].x2 = xx + x ;//x终点
a[i].y1 = y ;//y起点
a[i].y2 = yy + y;//y终点
a[i].num = i ;//地毯序号
}
int aa , b ;
scanf("%d%d",&aa,&b) ;
sort(a+1,a+1+n,cmp) ;
for(int i = 1 ; i <= n ; i ++){
if(aa >= a[i].x1 && aa <= a[i].x2 && b >= a[i].y1 && b <= a[i].y2){//如果在当前地毯中,就输出当前地毯的编号
printf("%d",a[i].num) ;
return 0 ;//直接结束程序
}
}
printf("%d",-1) ;//如果地毯都铺完了也没有找到,输出-1
return 0 ;
}
完结散花!!!!
我的小链接:
https://www.luogu.org/blog/020321cosmos/
啥也没有hehe