Cod sursa(job #192131)

Utilizator Omega91Nicodei Eduard Omega91 Data 30 mai 2008 21:39:33
Problema Secv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>
using namespace std;

void citire(int *a, int &n)
{
	ifstream f1("secv.in");
	f1 >> n;
	for (int i = 1; i <= n; ++i) f1 >> a[i];
	f1.close();
}

int det_poz_max(int *a, int n)
{
	int max = a[1], pozmax = 0;
	for (int i = 2; i <= n; ++i)
		if (max < a[i]) {
			max = a[i];
			pozmax = i;
		}
	return pozmax;
}

int sum_centru(int *a, int n, int pozmax, int &ci, int &cj)
{
	ci = 1;
	cj = n - 1;
	return a[1] + a[pozmax] + a[n];
}

int sum_dreapta(int *a, int n, int pozmax, int &ci, int &cj)
{
	int max, mins, ss;
	max = a[1];
	mins = 3 * a[pozmax];
	if (pozmax < 3) return mins;
	for (int i = 1; i < pozmax; ++i) {
		if (max < a[i]) max = a[i];
		ss = max + a[i + 1] + a[pozmax];
		if (mins > ss) {
			ci = i;
			cj = i + 1;
			mins = ss;
		}
	}
	return mins;
}

void mirror(int *a, int n)
{
	int l1, l2, aux;
	for (l1 = 0, l2 = n - 1; l1 < l2; ++l1, --l2) {
		aux = a[l1];
		a[l1] = a[l2];
		a[l2] = aux;
	}
}

int sum_stanga(int *a, int n, int pozmax, int &ci, int &cj)
{
	int s;
	if (pozmax > n - 2) return 3 * a[pozmax];
	mirror(a, n);
	s = sum_dreapta(a, n, pozmax, ci, cj);
	ci = n - ci + 1;
	cj = n - cj + 1;
	return s;
}

void afisare(int s, int ci, int cj)
{
	ofstream f2("secv.out");
	f2 << s << endl << ci << " " << cj;
	f2.close();
}

int main()
{
	int a[30002], n, pozmax, s1, s2, s3, ci1, ci2, ci3, cj1, cj2, cj3;
	citire(a, n);
	det_poz_max(a, n);
	s1 = sum_centru(a, n, pozmax, ci1, cj1);
	s2 = sum_dreapta(a, n, pozmax, ci2, cj2);
	s3 = sum_stanga(a, n, pozmax, ci3, cj3);
	if (s1 >= s2) {
		if (s1 >= s3) {
			afisare(s1, ci1, cj1);
			return 0;
		}
		else {
			afisare(s3, ci3, cj3);
			return 0;
		}
	}
	else
		if (s2 >= s3) {
			afisare(s2, ci2, cj2);
			return 0;
		}
		else {
			afisare(s3, ci3, cj3);
		}



	return 0;
}