Pagini recente » Cod sursa (job #115667) | Cod sursa (job #2613684) | Cod sursa (job #1323350) | Cod sursa (job #2614738) | Cod sursa (job #1174716)
#include <cstdio>
#include <algorithm>
using namespace std;
#define nmax 100010
#define ll long long
#define inf 1000000
class TTickes
{
public:
int Compute(int iLeft, int iRight);
void ComputeSolution();
int m_iLength, m_vData[nmax];
protected:
ll m_a[nmax];
int m_q[nmax];
};
TTickes* objTickets;
ll llSol=0;
//------------------------------------------------------------
int TTickes::Compute(int iLeft, int iRight)
{
int r, d=iRight-iLeft+1;
ll x=(ll) m_vData[iLeft]*d;
if (m_vData[iLeft]==m_vData[iRight])
r=inf;
else
if (x<=m_vData[iRight])
r=-1;
else
{
x-=m_vData[iRight];
r=x/(m_vData[iRight]-m_vData[iLeft]);
r+=iRight+1;
}
return r;
}
//------------------------------------------------------------
void TTickes::ComputeSolution()
{
int i, iSt, iDr, x;
sort (m_vData+1, m_vData+m_iLength+1);
for (i=1; i<=m_iLength; i++)
m_a[i]=(ll) this->m_vData[i]*(m_iLength-i+1);
iSt=1; iDr=0;
for (i=1; i<=m_iLength; i++)
{
while (iSt<iDr && Compute(m_q[iSt], m_q[iSt+1])<=i)
iSt++;
while (iSt<=iDr)
{
x=Compute(m_q[iDr], i);
if (x==-1)
iDr--;
else
if (iSt<iDr && x<Compute(m_q[iDr-1], i))
iDr--;
else
break;
}
if (x!=inf)
m_q[++iDr]=i;
if ((ll) m_vData[m_q[iSt]]*(i-m_q[iSt]+1)+m_a[i+1]>llSol)
llSol = (ll) m_vData[m_q[iSt]]*(i-m_q[iSt]+1)+m_a[i+1];
}
}
//------------------------------------------------------------
void ReadData()
{
FILE * fIn = fopen("avioane.in","r");
fscanf(fIn,"%d", &objTickets->m_iLength);
for (int i=1; i<=objTickets->m_iLength; i++)
fscanf(fIn,"%d", &objTickets->m_vData[i]);
fclose(fIn);
}
//------------------------------------------------------------
int main()
{
objTickets = new TTickes();
ReadData();
objTickets->ComputeSolution();
FILE * fOut = fopen("avioane.out","w");
fprintf(fOut,"%lld\n",llSol);
fclose(fOut);
}