Pagini recente » Cod sursa (job #453781) | Cod sursa (job #1019111) | Cod sursa (job #2349453) | Cod sursa (job #1169343) | Cod sursa (job #2193855)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("ferma.in");
ofstream g("ferma.out");
int mrk[20005],n,k,v[20005],s,i1,i2,best,ind,j=1,inf=(1<<30);
int bestmin,I1,I2,rez,nr;
bool ok=true;
void SSM()
{
s=-inf; best=-inf; v[2*n]=-inf;
for(int i=1;i<2*n;++i)
{
if(i==ind+n) break;
while(mrk[i]==1 && i<2*n)
{
s=-inf; ++i;
}
if(s<0)
{
s=v[i];
ind=i;
}
else s+=v[i];
if(s>best)
{
i1=ind;
i2=i;
best=s;
}
}
}
void SSm()
{
s=inf; bestmin=inf; v[2*n]=inf;
for(int i=1;i<2*n;++i)
{
while(mrk[i]==0 && i<2*n)
{
s=inf; ++i;
}
if(s>0)
{
s=v[i];
ind=i;
}
else s+=v[i];
if(s<bestmin)
{
I1=ind;
I2=i;
bestmin=s;
}
}
}
int main()
{
f>>n>>k;
for(int i=1;i<=n;++i) f>>v[i];
for(int i=1;i<=n;++i) v[i+n]=v[i];
while(ok==true && nr<k)
{
ok=false;
SSM();
SSm();
if(best>0 || bestmin<0) {ok=true;
if(best>=-bestmin)
{
rez+=best;
for(int i=i1;i<=i2;++i)
{
mrk[i]=1;
if(i>n) mrk[i-n]=1;
else mrk[i+n]=1;
}
}
else
{
rez-=bestmin;
for(int i=I1;i<=I2;++i)
{
mrk[i]=0;
if(i>n) mrk[i-n]=0;
else mrk[i+n]=0;
}
} }
++nr;
}
nr=0;
for(int i=1;i<2*n;++i) nr+=mrk[i]; nr/=2;
for(int i=nr+1;i<=k;++i)
{
SSM();
rez+=best;
mrk[i1]=1;
mrk[i1+n]=1;
}
g<<max(rez,0);
return 0;
}