参考洛谷P1003 [NOIP2011 提高组] 铺地毯
50分代码:完全按照题目思维来写,超时
#include<iostream>
using namespace std;
int carpet[10001][10001];
int main() {
int n;
cin >> n;
for(int m=1;m<=n;m++) {
int a, b, g, k;
cin >> a >> b >> g >> k;
for (int i = a; i <= a + g; i++) {
for (int j = b; j <= b + k; j++) {
carpet[i][j] = m;
}
}
}
int x, y;
cin >> x >> y;
cout << carpet[x][y];
return 0;
}
100分代码:(和题目反着来,要查地毯上最高铺着的是第几块地毯,就从最后一块地毯的范围倒着遍历)
#include<iostream>
using namespace std;
const int MAX = 1e5 + 5;
int a[MAX], b[MAX], g[MAX], k[MAX];
int main() {
int n;
cin >> n;
int flag = 0;
for(int i=1;i<=n;i++) {
cin >> a[i] >> b[i] >> g[i] >> k[i];
}
int x, y;
cin >> x >> y;
for (int i = n; i >= 1; i--) {
if (a[i] <= x && x <= a[i] + g[i] && b[i] <= y && y <= b[i] + k[i]) {
cout << i;
flag = 1;
break;
}
}
if (!flag) {
cout << -1;
}
return 0;
}
我发现做题不能被题目思路误导,得自己想想本质。