Cod sursa(job #617558)

Utilizator costyv87Vlad Costin costyv87 Data 15 octombrie 2011 00:36:09
Problema Avioane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f,*g;
#define nmax 100100;
int v[100100],l[100100],cni,i,j,n;
long long r[100100],cn;

void divide(int st,int dr) {
int m;
long long cn;


if (st<=dr) {
    m=(st+dr)/2;
    r[m]=-1;
    for (j=l[st-1];j<=l[dr+1] && j<=m;j++)  {
        cn=(long long)(m-j+1)*v[j];
        if (cn>r[m]) {
            r[m]=cn;
            l[m]=j;
            }
        }
    divide(st,m-1);
    divide(m+1,dr);
    }

}


int main() {
f=fopen("avioane.in","r");
g=fopen("avioane.out","w");

fscanf(f,"%d",&n);
for (i=1;i<=n;i++)
    fscanf(f,"%d",&v[i]);

sort(v+1,v+n+1);
l[1]=1;
r[1]=v[1];

l[n+1]=n;
divide(1,n);

/*for (i=2;i<=n;i++) {
    for (j=l[i-1],cn=-1;j<=i;j++)
        if (cn<(long long)(i-j+1)*v[j])  {
            cn=(long long)(i-j+1)*v[j];
            cni=j;
            }
    l[i]=cni;
    r[i]=cn;
    }*/


long long sol = 0;

for(int i = 2; i <= n; i++) {
    long long x = (long long ) (n - i + 1) * v[i] + r[i - 1];
    if(x > sol) {
        sol = x;
        }
    }

fprintf(g,"%lld",sol);

fclose(g);
return 0;
}