我需要计算数组元素之间的差异(仅当下一个元素大于前一个元素时),并将这些差异的总和与第一个数组元素一起返回。
3
1 5 6
ans = 1 + [5-1] + [6-5] = 6
这是我的代码:
#include <stdio.h>
int main() {
long long int T, N, M[100000], i, j, diff[100000];
int sum = 0;
scanf("%lld", &T);
while (T--) {
scanf("%lld", &N);
for (i = 0; i < N; i++) {
scanf("%lld", &M[i]);
}
for (i = 0; i < N-1; i++) {
if (M[i] < M[i+1]) {
diff[i] = M[i+1] - M[i];
sum = sum + diff[i];
}
}
printf("%d\n", sum + M[0]);
}
return 0;
}
我如何做到这一点?
答案 0 :(得分:0)
问题是,对于sum
的每次迭代,您都没有将T
重置为零。因此,它在后续测试用例中错误地保留了先前测试用例的总和。
您可以通过在sum = 0;
循环开头设置while(T--)
来解决此问题。
此外,我将如何重写此内容:
#include <stdio.h>
#include <stdlib.h>
typedef long long int num_t;
#define NUMFMT "%lld"
int main() {
num_t T;
scanf(NUMFMT,&T);
while (T--) {
num_t N;
scanf(NUMFMT,&N);
if (N < 1) { fprintf(stderr, "error: require at least one number.\n" ); exit(1); }
N--;
num_t M1;
scanf(NUMFMT,&M1);
num_t sum = M1;
while (N--) {
num_t M2;
scanf(NUMFMT,&M2);
if (M1 < M2)
sum += M2-M1;
M1 = M2;
} // end while
printf(NUMFMT"\n",sum);
} // end while
return 0;
} // end main()
演示:
ls;
## acus.c
gcc acus.c -o acus;
ls;
## acus.c acus*
./acus;
## 6
## 1 5
## 5
## 3 1 2 3
## 3
## 3 3 2 1
## 3
## 3 1 5 6
## 6
## 4 6 4 2 3
## 7
## 0
## error: require at least one number.
答案 1 :(得分:0)
这应该在代码审查中......
您的代码读取T,并通过循环销毁其值。做自己和读者一个忙,并调用变量&#34; numberOfTestCases&#34;,然后为(long long testCase = 0; testCase&lt; numberOfTestCases; ++ testCase)做一个循环...那个&#39; s写循环的标准方法。相信我,更长的变量名称不会减慢代码速度。
您将M声明为long long int,并将其声明为int。现在考虑一下:即使在最简单的情况下,M [0] = 0且M [1]> 0,如果M [1]很大,那么它就不适合int。这绝对没有意义。 sum保持的值必须与M保持的值相同或更大。
您在测试用例的循环外声明并初始化了总和。您可能已经了解到应始终初始化变量。错误。这里的初始化只是隐藏了一个致命的错误,那就是你不能再次将总和重置为0。你应该在你的循环中声明了sum,只针对一个测试用例。在循环外声明并初始化它是一个等待发生的错误。
diff数组完全没有意义。你只是在浪费800KB的内存。从不使用变量j,这令人困惑。
您正在为类型不相关的各种项目使用一个声明。 T的类型应基于您需要处理的最大测试集数量。 N和i的类型应基于测试中的最大值。 M的类型应该基于输入值有多大的要求。这三种类型是无关的,你仍然使用一个声明。 &#34;事故等待发生&#34;。
如果N&gt;您的应用会崩溃100,000或N = LLONG_MIN。
您将所有功能都放入main()。那不是主要的东西。 main()应该设置你的应用程序并启动它。很可能main()应该调用函数do_homework,而do_homework应该调用函数read_data和calculate_sum。