已知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重新分配内存了,那数据还在原来的内存里呢,新内存里全是随机数啊