SPOJ_4560
这个题目相当于将两个串个各分成了数量相等若干段,如果将对应的两小段看成一组,那么每组只能选其一累加,求最后的和最大是多少。因此可以用两个指针指向这两个数组,初始时两个指针都位于最左边,然后遍历这两个数组,如果某个指针指向的值较小,那么就累加这个这个值并使指针位置加1,当出现两个指针所指的值相等时,就说明遍历完成了一组,选择其中较大的累加即可。
#include<stdio.h> #include<string.h> #define MAXD 10010 int N, M, a[MAXD], b[MAXD], suma, sumb; void init() { int i; for(i = 0; i < N; i ++) scanf("%d", &a[i]); a[N] = 100000; scanf("%d", &M); for(i = 0; i < M; i ++) scanf("%d", &b[i]); b[M] = 100000; } int Max(int x, int y) { return x > y ? x : y; } void solve() { int i, j, ans = 0; i = j = suma = sumb = 0; for(;;) { if(a[i] == b[j]) ans += Max(suma, sumb), suma = sumb = a[i], ++ i, ++ j; else if(a[i] < b[j]) suma += a[i], ++ i; else sumb += b[j], ++ j; if(i > N) break; } printf("%d\n", ans); } int main() { while(scanf("%d", &N), N != 0) { init(); solve(); } return 0; }