Pagini recente » Cod sursa (job #1165973) | Cod sursa (job #1482328) | Cod sursa (job #1857729) | Cod sursa (job #1744462) | Cod sursa (job #1023255)
#include<stdio.h>
int n,e,D;
int v[52],dp[2][10002];
inline int mod(int a)
{
return a<0?-a:a;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
int verific(int d)
{
int i,j,k,maxi=v[n],lin,lina;
for(i=0;i<2;++i)
for(j=1;j<=maxi;++j)
dp[i][j]=2000000000;
for(j=1;j<=maxi;++j)
{
if(j>d)
continue;
dp[1][j]=mod(j-v[2]);
}
lin=0;lina=1;
for(i=3;i<n;++i)
{
for(j=0;j<=maxi;++j) //////////
for(k=0;k<=d&&k<=j;++k)
if(dp[lina][j-k]!=2000000000) //////////
dp[lin][j]=min(dp[lin][j],dp[lina][j-k]+mod(j-v[i]));
lin=1-lin;
lina=1-lina;
}
for(j=maxi-d;j<=maxi;++j)
if(dp[lina][j]<=e)
return 1;
return 0;
}
void caut()
{
int st=1,dr=v[n],med,l;
while(st<=dr)
{
med=(st+dr)/2;
if(verific(med))
{
l=med;
dr=med-1;
}
else
st=med+1;
}
D=l;
}
int main()
{
freopen("stalpi2.in","r",stdin);
freopen("stalpi2.out","w",stdout);
int i;
scanf("%d%d",&n,&e);
for(i=2;i<=n;++i)
scanf("%d",&v[i]);
caut();
printf("%d\n",D);
return 0;
}