每日一题,吃!通过率只有60%

问题遇到的现象和发生背景

已知n个整数。
每3个数算一个周期。
不足一个周期补0.
在周期的第一个位置的数的权值和等于a1+a[1+3]+…

求三个数的最大权值。
如果最大权值为第一个数,输出’J’;
最大权值为第二个数,输出’H’;
最大权值为第三个数,输出’B’。

输入描述:

第一行输入一个整数n。(1<=n<=100)
第二行输入n个整数。

输出描述:

输出答案。

输入样例:

4
1 1 1 1

输出样例:

J

问题相关代码,请勿粘贴截图

#include
#include

void solution(int n, int arr[]){
int m=0,sum=0,state,max=0;
if(n%3!=0)
{
m=n+3-n%3;
arr = (int*)malloc(m * sizeof(int));
if(n%3==2) arr[m-1]=0;
if(n%3==1)
{
arr[m-1]=0;
arr[m-2]=0;
}
}
for(int j=0;j<3;j++)
{
sum=0;
for(int i=0;i<(n/3+1);i++)
{

        sum+=arr[j+3*i];
    }
    if(max<sum)
        {
            state=j;
            max=sum;
        }
}
switch(state)
{
    case 0:printf("J");break;
    case 1:printf("H");break;
    case 2:printf("B");break;
}

}

int main() {

int n;
scanf("%d", &n);
int *arr;

arr = (int*)malloc(n * sizeof(int));

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

return 0;

}

运行结果及报错内容

通过率只有60%。
哪有问题?

你应该在一开始就判断n是不是能被3整除,并且在给arr分配内存的时候就用最终的长度去分配
而不是在执行函数的时候发现长度不对就把arr重新分配内存了,那数据还在原来的内存里呢,新内存里全是随机数啊