CBingkun 2023-12-21 21:26 采纳率: 100%
浏览 21
已结题

大一小白,已经通宵写了两天了,卡在最后一个测试点了

本人是大一小白一枚,已经卡了我整整两天了,希望各位能够帮我解决一下!!

这是2023年第十四届蓝桥杯C/C++大学C组的C题:
https://www.dotcpp.com/oj/problem3158.html
这是题目的链接,用C语言写,不是C++
我卡在90分过不去了,最后一个测试点写了好久就是过不去,哭死

img


然后一下是我自己写的代码,希望各位能帮我看看修改修改,谢谢啦~

#include <stdio.h>
#include <stdlib.h>

struct A 
{
    int x, y, z;
};
struct A arr[100001];

int pareX(const void* a, const void* b) 
{
    return (((struct A*)b)->x - ((struct A*)b)->y - ((struct A*)b)->z) -
           (((struct A*)a)->x - ((struct A*)a)->y - ((struct A*)a)->z);
}

int pareY(const void* a, const void* b) 
{
    return (((struct A*)b)->y - ((struct A*)b)->x - ((struct A*)b)->z) -
           (((struct A*)a)->y - ((struct A*)a)->x - ((struct A*)a)->z);
}

int pareZ(const void* a, const void* b) 
{
    return (((struct A*)b)->z - ((struct A*)b)->x - ((struct A*)b)->y) -
           (((struct A*)a)->z - ((struct A*)a)->x - ((struct A*)a)->y);
}

long long int X, Y, Z;

int main() 
{
    int n;
    int ix = -1, iy = -1, iz = -1;
    scanf("%d", &n);

    for (int i = 0; i < n; i++) 
    {
        scanf("%d", &arr[i].x);
    }

    for (int i = 0; i < n; i++) 
    {
        scanf("%d", &arr[i].y);
    }

    for (int i = 0; i < n; i++) 
    {
        scanf("%d", &arr[i].z);
    }

    X = 0, Y = 0, Z = 0;

    qsort(arr, n, sizeof(struct A), pareX);

    for (int i = 0; i < n; i++) 
    {
        X += arr[i].x;
        Y += arr[i].y;
        Z += arr[i].z;

        if (X - Y - Z > 0)
        {
            ix = i;
        }
        else
        {
            break;
        }
    }

    X = 0, Y = 0, Z = 0;

    qsort(arr, n, sizeof(struct A), pareY);

    for (int i = 0; i < n; i++) 
    {
        X += arr[i].x;
        Y += arr[i].y;
        Z += arr[i].z;

        if (Y - X - Z > 0)
        {
            iy = i;
        }
        else
        {
            break;
        }
    }

    X = 0, Y = 0, Z = 0;

    qsort(arr, n, sizeof(struct A), pareZ);

    for (int i = 0; i < n; i++) 
    {
        X += arr[i].x;
        Y += arr[i].y;
        Z += arr[i].z;

        if (Z - X - Y > 0)
        {
            iz = i;
        }
        else
        {
            break;
        }
    }

    printf("%d", (ix > iy ? (ix > iz ? ix : iz) : (iy > iz ? iy : iz)) + 1);

    return 0;
}


代码写的比较垃圾
希望问题能被解决

  • 写回答

3条回答

  • 秃秃土狗 2023-12-22 14:56
    关注

    以下是对该代码进行内存优化的建议:

    1、避免使用大数组:在该代码中,定义了一个包含100001个结构体的数组。如果输入的n比100001小,那么这个数组就浪费了很多内存。因此,可以使用动态内存分配来避免这个问题。

    2、使用局部变量:在该代码中,定义了一些全局变量,例如X、Y、Z、ix、iy和iz。这些变量只在main函数中使用,因此可以将它们改为局部变量,以减少内存的使用。

    3、避免重复计算:在该代码中,对每个维度都进行了一次排序和一次遍历,同时计算X、Y和Z的值。这样会导致重复计算,浪费计算资源。可以将计算X、Y和Z的值的代码提取出来,只在遍历时计算一次,以减少重复计算。

    下面是修改后的代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct A 
    {
        int x, y, z;
    };
    
    int pareX(const void* a, const void* b) 
    {
        return (((struct A*)b)->x - ((struct A*)b)->y - ((struct A*)b)->z) -
               (((struct A*)a)->x - ((struct A*)a)->y - ((struct A*)a)->z);
    }
    
    int pareY(const void* a, const void* b) 
    {
        return (((struct A*)b)->y - ((struct A*)b)->x - ((struct A*)b)->z) -
               (((struct A*)a)->y - ((struct A*)a)->x - ((struct A*)a)->z);
    }
    
    int pareZ(const void* a, const void* b) 
    {
        return (((struct A*)b)->z - ((struct A*)b)->x - ((struct A*)b)->y) -
               (((struct A*)a)->z - ((struct A*)a)->x - ((struct A*)a)->y);
    }
    
    int main() 
    {
        int n;
        scanf("%d", &n);
    
        struct A* arr = (struct A*)malloc(n * sizeof(struct A));
    
        for (int i = 0; i < n; i++) 
        {
            scanf("%d", &arr[i].x);
        }
    
        for (int i = 0; i < n; i++) 
        {
            scanf("%d", &arr[i].y);
        }
    
        for (int i = 0; i < n; i++) 
        {
            scanf("%d", &arr[i].z);
        }
    
        int ix = -1, iy = -1, iz = -1;
        int X = 0, Y = 0, Z = 0;
    
        qsort(arr, n, sizeof(struct A), pareX);
    
        for (int i = 0; i < n; i++) 
        {
            X += arr[i].x;
            Y += arr[i].y;
            Z += arr[i].z;
    
            if (X - Y - Z > 0)
            {
                ix = i;
            }
            else
            {
                break;
            }
        }
    
        X = 0, Y = 0, Z = 0;
    
        qsort(arr, n, sizeof(struct A), pareY);
    
        for (int i = 0; i < n; i++) 
        {
            X += arr[i].x;
            Y += arr[i].y;
            Z += arr[i].z;
    
            if (Y - X - Z > 0)
            {
                iy = i;
            }
            else
            {
                break;
            }
        }
    
        X = 0, Y = 0, Z = 0;
    
        qsort(arr, n, sizeof(struct A), pareZ);
    
        for (int i = 0; i < n; i++) 
        {
            X += arr[i].x;
            Y += arr[i].y;
            Z += arr[i].z;
    
            if (Z - X - Y > 0)
            {
                iz = i;
            }
            else
            {
                break;
            }
        }
    
        printf("%d", (ix > iy ? (ix > iz ? ix : iz) : (iy > iz ? iy : iz)) + 1);
    
        free(arr);
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月1日
  • 已采纳回答 12月24日
  • 创建了问题 12月21日