为什么这个代码才50分?

图片说明
图片说明

#include <iostream>
#include <cstdlib>
using namespace std;
int sum = 0;
int n, x, y;
int a[100], b[100], g[100], k[100];
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i] >> b[i] >> g[i] >> k[i];
    }
    cin >> x >> y;
    for (int i = 1; i <= n; i++) {
        if (a[i] <= x && b[i] <= y && a[i] + g[i] >= x && b[i] + g[i] >= y)
            sum = i;
    }
    if (sum == 0)
        cout << -1;
    cout << sum;
    system("pause");
    return 0;
}

帮你改了一下,洛谷上面测了可以过

#include <iostream>
using namespace std;
int n, x, y;
int a[100001], b[100001], g[100001], k[100001];
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i] >> b[i] >> g[i] >> k[i];
    }
    cin >> x >> y;
    for (int i = n; i >= 1; i--) {//建议你倒过来找,这样找到的第一个就是最上面的那一个,就可以直接输出了
        if (a[i]<=x&&b[i]<=y&&(a[i]+g[i]>=x)&&(b[i]+k[i]>=y)) {
            cout << i;
            return 0;
        }
    }
    cout << -1;
    return 0;
}

这个判断有问题: (a[i] <= x && b[i] <= y && a[i] + g[i] >= x && b[i] + g[i] >= y)
g和k表示x和y上的长度,那么 应该是
(a[i] + g[i] - 1) >= x
(b[i] + k[i] - 1) >= y
比如某个地毯的数据 (1,1, 3,4),那么x的范围(1-3), y的范围(1-4)。

代码中的错误点有两个,一是范围变大了一格,二是y的上限用g[i]计算,而不是用k[i].