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;    
}

 

 

posted on 2012-07-19 18:04  Staginner  阅读(334)  评论(0编辑  收藏  举报