Cod sursa(job #470026)
#include <stdio.h>
using namespace std;
int v[100001];
int n, i, j;
int S, pozitie;
int Max, gasit;
struct oua
{
int suma;
int poz;
}ou[100001];
int main ()
{
FILE *f = fopen ("oo.in","r");
FILE *g = fopen ("oo.out","w");
fscanf (f,"%d", &n);
for (i=1; i<=n; ++i)
fscanf (f,"%d", &v[i]);
if (v[1] + v[2] > v[1] + v[n])
{
ou[1].suma = v[1] + v[2];
ou[1].poz = 2;
}
else
{
ou[1].suma = v[1] + v[n];
ou[1].poz = n;
}
if (v[n] + v[1] > v[n] + v[n-1])
{
ou[n].suma = v[n] + v[1];
ou[n].poz = 1;
}
else
{
ou[n].suma = v[n] + v[n-1];
ou[n].poz = n - 1;
}
for (i=2; i<n; ++i)
{
if (v[i] + v[i+1] > v[i] + v[i-1])
{
ou[i].suma = v[i] + v[i+1];
ou[i].poz = i + 1;
}
else
{
ou[i].suma = v[i] + v[i-1];
ou[i].poz = i - 1;
}
}
/*for (i=1; i<=n; ++i)
printf ("%d ", ou[i].suma);
printf ("\n\n");
for (i=1; i<=n; ++i)
printf ("%d ", ou[i].poz);*/
while (1)
{
gasit = 0;
Max = 0;
for (i=1; i<=n; ++i)
if (ou[i].suma > Max && ou[ou[i].poz].poz != -1 && ou[i].poz != -1)
{
Max = ou[i].suma;
pozitie = i;
gasit = 1;
}
if (gasit)
{
S += Max;
if (pozitie == 1)
{
if (ou[1].poz == n)
ou[n].poz = ou[n-1].poz = ou[1].poz = ou[2].poz = -1;
else
ou[1].poz = ou[n].poz = ou[2].poz = ou[3].poz = -1;
}
else if (pozitie == n)
{
if (ou[n].poz == 1)
ou[n].poz = ou[1].poz = ou[2].poz = ou[n-1].poz = -1;
else
ou[n].poz = ou[n-1].poz = ou[n-2].poz = ou[1].poz = -1;
}
else
{
ou[ou[pozitie].poz].poz = ou[ou[pozitie].poz+1].poz = ou[ou[pozitie].poz-1].poz = -1;
ou[pozitie].poz = ou[pozitie-1].poz = ou[pozitie+1].poz = -1;
}
}
else
break;
/*for (i=1; i<=n; ++i)
printf ("%d ", ou[i].poz);
printf ("\n_________\n");*/
}
//printf ("%d", S);
fprintf (g,"%d", S);
fclose(g);
fclose(f);
return 0;
}