Pagini recente » Cod sursa (job #2598613) | Cod sursa (job #2127369) | Cod sursa (job #780791) | Cod sursa (job #1078090) | Cod sursa (job #2806244)
#include <stdio.h>
using namespace std;
FILE* f, * g;
int v[500004];
int main()
{
int n, i, nr, xx, li1 = 1, lf1 = 1, so1 = -999999999, si1 = 0, lg1 = 0, tot = 0, poz, li2 = 1, lf2 = 1, so2 = 999999999, si2 = 0, lg2 = 0, lg;
f = fopen("buline.in", "r");
g = fopen("buline.out", "w");
fscanf(f, "%d", &n);
for (i = 1;i <= n;i++)
{
fscanf(f, "%d %d", &v[i], &xx);
if (xx == 0)
v[i] = v[i] * (-1);
v[n + i] = v[i];
tot += v[i];
}
poz = 1;
for (i = 1;i <= 2 * n;i++)///1
{
if (si1 < 0)
{
if (i > n)
break;
si1 = v[i], poz = i;
}
else
si1 += v[i];
if (si1 > so1 && i - li1 + 1 <= n)
{
so1 = si1;
li1 = poz;
lf1 = i;
}
}
lg1 = lf1 - li1 + 1;///lungimea sumei de secventa maxima
poz = 1;
for (i = 1;i <= 2 * n;i++)
{
if (si2 > 0)
{
if (i > n)
break;
si2 = v[i], poz = i;
}
else
si2 += v[i];
if (si2 < so2 && i - li2 + 1 <= n)
{
so2 = si2;
li2 = poz;
lf2 = i;
}
}
lg2 = lf2 - li2 + 1;///lungimea sumei de secventa minima
lg = n - lg2;
if (tot - so2 > so1 && lg != 0)///daca am gasit o secventa de lungime maxima mai mare decat cea determinata la 1
{
so1 = tot - so2;
li1 = lf2 + 1;
lg1 = lg;
}
fprintf(g, "%d %d %d", so1, li1, lg1);
fclose(f);
fclose(g);
return 0;
}