题目来源:https://ac.nowcoder.com/acm/problem/16593

hello

思路:

就是把每一组地毯存到二维数组里,一行代表一张地毯。

然后自上而下判断某点的地毯,得到的马上break,就是最上面的。

首先进行存储:

int n,res;
cin>>n;
int a[10000][10000];
for(int i=0;i<n;i++){
for(int j=0;j<4;j++){
cin>>a[i][j];
}
}

自上而下进行check操作,判断某张毯子是否是答案:

int x,y;
cin>>x>>y;
for(int i=n-1;i>=0;i--){
if(check(a[i],x,y)){
res=i;

break;
}
}

check稍微用了一下指针,也可以直接用下标的:

bool check(int* p,int x,int y){
if((*p<=x&&(*(p+2)+*p)>=x)&&(*(p+1)<=y&&(*(p+3)+*(p+1)>=y))){
return 1;
}
return 0;
}

输出答案需要+1,因为毯子从1开始:

cout<<res+1;

就OK辽!

#include<bits/stdc++.h>
using namespace std;
bool check(int* p,int x,int y){
if((*p<=x&&(*(p+2)+*p)>=x)&&(*(p+1)<=y&&(*(p+3)+*(p+1)>=y))){
return 1;
}
return 0;
}
int main(){
int n,res;
cin>>n;
int a[10000][10000];
for(int i=0;i<n;i++){
for(int j=0;j<4;j++){
cin>>a[i][j];
}
}
int x,y;
cin>>x>>y;
for(int i=n-1;i>=0;i--){
if(check(a[i],x,y)){
res=i;

break;
}
}


cout<<res+1;
return 0;
}