File tree Expand file tree Collapse file tree 1 file changed +82
-0
lines changed Expand file tree Collapse file tree 1 file changed +82
-0
lines changed Original file line number Diff line number Diff line change @@ -388,3 +388,85 @@ if __name__ == "__main__":
388388 main()
389389
390390```
391+ ### C
392+
393+ 前缀和
394+ ``` c
395+ #include < stdlib.h>
396+ #include < stdio.h>
397+
398+ int main ()
399+ {
400+ int n = 0, m = 0, ret_ver = 0, ret_hor = 0;
401+
402+ // 读取行和列的值
403+ scanf ("%d%d", &n, &m);
404+ // 动态分配数组a(横)和b(纵)的空间
405+ int * a = (int * )malloc(sizeof(int) * n);
406+ int * b = (int * )malloc(sizeof(int) * m);
407+
408+ // 初始化数组a和b
409+ for (int i = 0; i < n; i++)
410+ {
411+ a[i] = 0;
412+ }
413+ for (int i = 0; i < m; i++)
414+ {
415+ b[i] = 0;
416+ }
417+
418+ // 读取区块权值并计算每行和每列的总权值
419+ for (int i = 0; i < n; i++)
420+ {
421+ for (int j = 0; j < m; j++)
422+ {
423+ int tmp;
424+ scanf ("%d", &tmp);
425+ a[ i] += tmp;
426+ b[ j] += tmp;
427+ }
428+ }
429+
430+ // 计算每列以及每行的前缀和
431+ for (int i = 1; i < n; i++)
432+ {
433+ a[i] += a[i - 1];
434+ }
435+ for (int i = 1; i < m; i++)
436+ {
437+ b[i] += b[i - 1];
438+ }
439+
440+ // 初始化ret_ver和ret_hor为最大可能值
441+ ret_hor = a[n - 1];
442+ ret_ver = b[m - 1];
443+
444+ // 计算按行划分的最小差异
445+ int ret2 = 0;
446+ while (ret2 < n)
447+ {
448+ ret_hor = (ret_hor > abs(a[n - 1] - 2 * a[ret2])) ? abs(a[n - 1] - 2 * a[ret2]) : ret_hor;
449+ // 原理同列,但更高级
450+ ret2++;
451+ }
452+ // 计算按列划分的最小差异
453+ int ret1 = 0;
454+ while (ret1 < m)
455+ {
456+ if (ret_ver > abs(b[m - 1] - 2 * b[ret1]))
457+ {
458+ ret_ver = abs(b[m - 1] - 2 * b[ret1]);
459+ }
460+ ret1++;
461+ }
462+
463+ // 输出最小差异
464+ printf ("%d\n", (ret_ver <= ret_hor) ? ret_ver : ret_hor);
465+
466+ // 释放分配的内存
467+ free (a);
468+ free(b);
469+ return 0;
470+ }
471+
472+ ```
You can’t perform that action at this time.
0 commit comments