Cod sursa(job #53560)

Utilizator varuvasiTofan Vasile varuvasi Data 22 aprilie 2007 15:18:53
Problema Buline Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <stdio.h>
#define FOR(i, a, b) for (i = (a); i <= (b); i++)
#define MaxN 200033

int A[MaxN], N;

int sum, smin, s, sp, ep, lsol, spsol;

int main()
{
    int i, val, sgn;
    
    FILE *fin = fopen("buline.in", "rt");
    FILE *fout = fopen("buline.out", "wt");
    
    int albe = 0, negre = 0;
    
    fscanf(fin, "%d", &N);
    FOR (i, 1, N)
    {
        fscanf(fin, "%d %d", &val, &sgn);
        if (!sgn) val *= -1, negre = 1;
        else      albe = 1;
        A[i] = val;
        sum += A[i];
    }
    
    
    smin = 0, s = 0, sp = 1;
    
    FOR(i, 1, N)
    {
        s += A[i];
        if (s < smin)
        {
            smin = s;
            ep = i;
            spsol = sp;
        }

        if (s > 0)
        {
            s = 0;
            sp = i + 1;
        }
    }
    
    sp = spsol;
    if (ep == N) spsol = 1;
    else         spsol = ep + 1;
    
    lsol = (N - spsol + 1) + (sp - 1);
    /*
    if (negre && !albe)
    {
        int j, min_val = A[1], pos_min = 1;
        FOR(j, 2, N)
            if (min_val < A[j]) min_val = A[j], pos_min = j;    
        fprintf(fout, "%d %d %d", min_val, pos_min, 1);
    }
    else
        if (!negre && albe)
        {
            fprintf(fout, "%d %d %d", sum, 1, N);
        }    
        else
            fprintf(fout, "%d %d %d", sum - smin, spsol, lsol);
      */      
    int smax = 0, spmax = 0, spsol2, lsol2;
    s = 0;
    FOR (i, 1, N)
    {
        s += A[i];
        if (s > smax)
        {
            smax = s;
            spsol2 = sp;
            ep = i;
        }
        if (s < 0)
        {
            s = 0;
            sp = i + 1;
        }
    }
    
    lsol2 = (ep - spsol2 + 1);
    
    if (sum - smin > smax)
        fprintf(fout, "%d %d %d", sum - smin, spsol, lsol);
    else 
        fprintf(fout, "%d %d %d", smax, spsol2, lsol2);
    
    fclose(fin);
    fclose(fout);
    
    return 0;    
}