题目名称:吃!吃!吃!时间限制:1000ms内存限制:256M
题目描述
已知n个整数。 每3个数算一个周期。 不足一个周期补0. 在周期的第一个位置的数的权值和等于a1+a[1+3]+… … 求三个数的最大权值。 如果最大权值为第一个数,输出’J’; 最大权值为第二个数,输出’H’; 最大权值为第三个数,输出’B’。
输入描述:
第一行输入一个整数n。(1<=n<=100) 第二行输入n个整数。
输出描述:
输出答案。
示例
输入
4
1 1 1 1
输出
J
这一题并不困难,重在理解权的概念
这里的权其实就是数组纵向相加(每三个输一行)
例如
1 1 1 第一个权为第一列相加即1+2+1=4
2 1 3 第二个权为1+1=2
1 第三个为1+3=4
显然第一个和第三个权相等且大于第二个所以输出J(认为第一个最大)
在,不更改原有代码的情况下,只要写出纵向相加的代码就可以了
完整代码(并不是最优解)
#include <stdio.h>
#include <stdlib.h>
void solution(int n, int arr[])
{
int q, q1, q3;
q = q1 = q3 = 0;//定义三个权,应为不为3的倍数要补0,所以权设为0,满足例如只有两个数的情况
if (n >= 3)//纵向相加求三个权值
{
for (int i = 0; i < n; i += 3)
q += arr[i];
for (int i = 1; i < n; i += 3)
q1 += arr[i];
for (int i = 2; i < n; i += 3)
q3 += arr[i];
if (q1 > q && q1 > q3)//接下来求最大权
{
printf("H");
}
else if (q3 > q && q3 > q1)
{
printf("B");
}
if (q > q1 && q > q3)
printf("J");
}
if(n<3)//小于时
{
if (n == 1)
printf("J");
if (n == 2)
{
q = arr[0];
q1 = arr[1];
if (q >= q1)//求权最大权,其实还应该考虑权三,因为前两个权可能为负
printf("J");
else
printf("H");
}
}
}
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;
}
提醒自己也提醒再看的朋友:刷题不要死磕,尽可能最大化利用时间
如果读到的朋友还有更优秀的解法,或者书写不妨分享一下,彼此学习,取长补短嘛,抱拳了老铁!