Cod sursa(job #644988)

Utilizator maritimCristian Lambru maritim Data 7 decembrie 2011 22:23:54
Problema Avioane Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<stdio.h>
#include<fstream>
#include<algorithm>
using namespace std;

ifstream f("avioane.in");
ofstream g("avioane.out");

#define MaxN 100100
#define ll long long

int N,A[MaxN],B[MaxN];
ll MAX;

void citire(void)
{
	f >> N;
	for(int i=1;i<=N;i++)
		f >> A[i];
}

inline int min(int a,int b)
{
	return a<b ? a:b;
}

inline int max(int a,int b)
{
	return a>b ? a:b;
}

void CreareB(void)
{
	int PozF = 1;
	
	sort(A+1,A+N+1);
	
	for(int i=1;i<=N;i++)
	if(A[i] != A[i-1])
	{
		PozF = A[i+1] != A[i] ? i+ A[i] / (A[i+1]-A[i]) : N;
		for(int j=i;j<=PozF;j++)
		{
			B[j] = max(B[j],A[i]*(j-i+1));
			(A[j+1] != A[i]) ? PozF = min(PozF,j + (A[i]*(j-i+1)) / (A[j+1]-A[i])) : N;
		}
	}
}

void Numarare(void)
{
	for(int i=1;i<=N;i++)
		if(MAX < A[i]*(N-i+1) + B[i-1])
			MAX = A[i]*(N-i+1) + B[i-1];
}

int main()
{
	citire();
	CreareB();
	Numarare();
	
	g << MAX;
	
	return 0;
}