日记
2024.5.8
今天写了洛谷
P1003 [NOIP2011 提高组] 铺地毯
关于这题,我有感悟:
先呈上我学习的第一篇代码:
#include<iostream>
using namespace std;
int main(){
int n=0;
long long arr[10001][10001];
cin>>n;
for(int i=1;i<=n;i++){
int a,b,c,d;
cin>>a>>b>>c>>d;
for(int j=a;j<=a+c;j++){
for(int k=b;k<=b+d;k++){
arr[j][k]=i;
}
}
}
int dot_1=0,dot_2=0;
cin>>dot_1>>dot_2;
if(arr[dot_1][dot_2]==0) cout<<"-1";
else cout<<arr[dot_1][dot_2];
return 0;
}
该代码中错就错在其内存为4*10000*10000=400000000byte=400000kb=400mb超出了所给出的内存;
为此,我们得舍弃二维用一维;
#include<iostream>
using namespace std;
int main(){
int n=0;
int arr[100005],brr[100005],crr[100005],drr[100005];
cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i]>>brr[i]>>crr[i]>>drr[i];
}
int x,y;
cin>>x>>y;
int count=0;
for(int i=1;i<=n;i++){
if(x>=arr[i]&&x<=crr[i]+arr[i]&&y>=brr[i]&&y<=drr[i]+brr[i]){
count=i;
}
}
if(count==0) cout<<"-1";
else cout<<count<<endl;
return 0;
}
以上代码就运用一维数组,避免了mle
再来讲讲两者的解题逻辑:
第一个代码是把所有的二维数列都标上了地毯的标号,一层覆盖一层,然后直接判断所给的点位上的最上面的标号是多少
第二个代码是根据给出的要查找的点位直接在已输入的四个一维数组中一层层判断范围,如果在这个范围中,就不断更新地毯标号,判断完毕就可得到最上面的地毯标号