Pagini recente » Cod sursa (job #1386959) | Cod sursa (job #2436068) | Cod sursa (job #1654552) | Cod sursa (job #1637614) | Cod sursa (job #3242891)
// 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;
}
//------------------------------------------------------------------------------------------
void third(int t[])
{
int *subtotal = new int[n], minSub = 2147483648;
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++)
{
minSub = min(minSub, subtotal[i]);
int diff = subtotal[i] - minSub;
if (diff > maxim)
{
maxim = diff;
}
}
delete[] subtotal;
}
//------------------------------------------------------------------------------------------
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
}*/
if (maxim < best[i])
{
maxim = best[i];
start = current;
End = i + 1;
}
}
delete[] best;
}
//------------------------------------------------------------------------------------------
int main()
{
in >> n;
int *t = new int[n];
for (int i = 0; i < n; i++)
{
in >> t[i];
}
third2(t);
out << maxim << " " << start << " " << End;
delete[] t;
return 0;
}