Pagini recente » Statistici Miclos Eduard (Miclos) | Cod sursa (job #1272574) | Cod sursa (job #2488090) | Cod sursa (job #1900582) | Cod sursa (job #3242912)
// https : // infoarena.ro/problema/ssm
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("ssm.in");
ofstream out("ssm.out");
//-----------------------------------------------
int n, s = 0, maxim = -2147483648, start = 1, End = 1;
//------------------------------------------------------------------------------------------
void read(int t[])
{
for (int i = 0; i < n; i++)
{
in >> t[i];
}
}
//------------------------------------------------------------------------------------------
void first(int t[], int n)
{
for (int i = 0; i < n; i++)
{
// in >> t[i];
for (int j = i; j < n; j++)
{
for (int k = i; k <= j; k++)
{
s += t[k];
if (s > maxim)
{
maxim = s;
start = i + 1;
End = k + 1;
}
}
s = 0;
}
}
}
//------------------------------------------------------------------------------------------
void second(int t[])
{
for (int i = 0; i < n; i++)
{
for (int j = i; j < n; j++)
{
s += t[j];
if (s > maxim)
{
maxim = s;
start = i + 1;
End = j + 1;
}
}
s = 0;
}
}
//------------------------------------------------------------------------------------------
// FIXME:valszeg nem megy i = 0 es j = 0 ra egyszere
void second2(int t[])
{
int *subtotal = new int[n];
in >> t[0];
subtotal[0] = t[0];
for (int i = 1; i < n; i++)
{
in >> t[i];
subtotal[i] = subtotal[i - 1] + t[i];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < i; j++)
{
s = subtotal[i] - subtotal[j];
if (s > maxim)
{
maxim = s;
start = j + 2;
End = i + 1;
}
}
s = 0;
}
delete[] subtotal;
}
//------------------------------------------------------------------------------------------
// FIXME: mar nem tudom mi a baja
void third(int t[])
{
/*int *subtotal = new int[n], minSub = 0, iminSub = 0;
in >> t[0];
subtotal[0] = t[0];
for (int i = 1; i < n; i++)
{
in >> t[i];
subtotal[i] = subtotal[i - 1] + t[i];
}
for (int i = 0; i < n; i++)
{
int diff = subtotal[i] - minSub;
if (diff > maxim)
{
maxim = diff;
start = iminSub + 1;
End = i + 1;
}
if (subtotal[i] < minSub)
{
minSub = subtotal[i];
iminSub = i + 1;
}
}
delete[] subtotal;*/
int subtotal = 0, minSub = 0, iminSub = 0;
int elem;
for (int i = 0; i < n; i++)
{
in >> elem;
subtotal = subtotal + elem;
int diff = subtotal - minSub;
if (diff > maxim)
{
maxim = diff;
start = iminSub + 1;
End = i + 1;
}
if (subtotal < minSub)
{
minSub = subtotal;
iminSub = i + 1;
}
}
}
//------------------------------------------------------------------------------------------
// DONE: nem tudom mi a baj csak 95p
void third2(int t[])
{
/*
int *best = new int[n];
best[0] = t[0];
int current = 1;
for (int i = 1; i < n; i++)
{
best[i] = max(t[i], best[i - 1] + t[i]);
if (best[i] == t[i])
{
current = i + 1; // azert kell mert egy uj reszosszeg kezdodik, viszont a startot itt nem lehet frissiteni mert nem biztos hogy ez a legnayobb
}
/*if (best[i - 1] + t[i] > t[i])
{
best[i] = best[i - 1] + t[i];
}
else
{
best[i] = t[i];
current = i + 1; // azert kell mert egy uj reszosszeg kezdodik, viszont a startot itt nem lehet frissiteni mert nem biztos hogy ez a legnayobb
}*a/
if (maxim < best[i])
{
maxim = best[i];
start = current;
End = i + 1;
}
}
delete[] best;
*/
int best = t[0], current = 1;
maxim = t[0];
for (int i = 1; i < n; i++)
{
// best = max(t[i], best + t[i]);
/*if (best == t[i])
{
current = i + 1; // azert kell mert egy uj reszosszeg kezdodik, viszont a startot itt nem lehet frissiteni mert nem biztos hogy ez a legnayobb
}*/
if (best + t[i] >= t[i])
{
best = best + t[i];
}
else
{
best = t[i];
current = i + 1; // azert kell mert egy uj reszosszeg kezdodik, viszont a startot itt nem lehet frissiteni mert nem biztos hogy ez a legnayobb
}
if (maxim < best)
{
maxim = best;
start = current;
End = i + 1;
}
}
}
//------------------------------------------------------------------------------------------
int main()
{
in >> n;
int *t; //= new int[n];
/*for (int i = 0; i < n; i++)
{
in >> t[i];
}*/
third(t);
out << maxim << " " << start << " " << End;
delete[] t;
return 0;
}