Pagini recente » Cod sursa (job #1523080) | Istoria paginii runda/sadas | Cod sursa (job #278427) | Cod sursa (job #1823667) | Cod sursa (job #629701)
Cod sursa(job #629701)
#include <iostream>
#include <stdio.h>
#define PRINT(x,N) do { for (int i = 0 ; i < N ; i ++) cout << x[i] << " "; cout << endl; } while(0);
using namespace std;
int main (void)
{
FILE *f = fopen ("ssm.in", "rt");
FILE *g = fopen ("ssm.out", "wt");
int N;
int *vec, *st, *dr;
bool *take;
fscanf(f,"%d",&N);
vec = new int [N];
st = new int [N];
dr = new int [N];
take = new bool [N];
for (int i = 0 ; i < N ; i ++)
fscanf(f, "%d", &vec[i]);
dr[0] = vec[0];
for(int i = 1 ; i < N ; i ++)
dr[i] = (dr [i - 1] + vec[i]) > vec[i] ? (dr [i - 1] + vec[i]) : vec[i];
int max = 0;
int poz;
for (int i = 0; i < N ; i ++)
if (max < dr[i])
{
max = dr[i];
poz = i;
}
// PRINT(dr,N);
// cin.get();
int end = poz;
int suma = max;
while (max > 0)
{
max -= vec[poz];
poz --;
}
int start = poz;
fprintf(g, "%d %d %d\n", suma, start + 2, end + 1);
/*
st[N - 1] = vec[N - 1];
for (int i = N - 2 ; i >=0 ; i --)
st[i] = st[i + 1] + vec[i];
take[0] = vec[0] >= 0;
take[N - 1] = vec[N - 1] >= 0;
for (int i = 1 ; i < N - 1; i ++)
if (dr[i - 1] <= dr[i + 1] && st[i - 1] >= st[i + 1] || vec[i] >= 0)
take[i] = true;
else
take[i] = false;
int maxIndex = 0;
int maxEnd = 0;
int maxSum = 0;
for (int i = 0 ; i < N ; i ++)
{
int sum = 0;
int index = i;
while (i < N && take[i])
{
sum += vec[i];
i ++;
}
if (sum > maxSum)
{
maxSum = sum;
maxIndex = index + 1;
maxEnd = i;
}
}
fprintf(g, "%d %d %d\n", maxSum, maxIndex, maxEnd);
PRINT(vec, N);
PRINT(st, N);
PRINT(dr, N);
PRINT(take, N);
*/
delete [] vec;
delete [] st;
delete [] dr;
delete [] take;
fclose(f);
fclose(g);
// cin.get();
return 0;
}