十六 Storage Keepers
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; const int inf=0x3f3f3f3f;
int a[],dp1[][],dp2[][]; int main()
{
int n,m;
int i,j,k;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n== && m==)
break;
for(i=;i<=m;i++)
scanf("%d",&a[i]);
memset(dp1,,sizeof(dp1));
for(i=;i<=m;i++)
dp1[i][]=inf;
for(i=;i<=n;i++)
dp1[][i]=; for(i=;i<=m;i++)
{
for(j=;j<=n;j++)
{
dp1[i][j]=dp1[i-][j];
for(k=;k<j;k++)
{
dp1[i][j]=max(dp1[i][j],min(dp1[i-][k],a[i]/(j-k)));
}
}
}
if(!dp1[m][n])
{
printf("0 0\n");
continue;
} memset(dp2,,sizeof(dp2));
for(i=;i<=m;i++)
dp2[i][]=;
for(i=;i<=n;i++)
dp2[][i]=inf; for(i=;i<=m;i++)
{
for(j=;j<=n;j++)
{
dp2[i][j]=dp2[i-][j];
for(k=;k<j;k++)
{
if((a[i]/(j-k))>=dp1[m][n])
{
dp2[i][j]=min(dp2[i][j],dp2[i-][k]+a[i]);
}
}
}
} printf("%d %d\n",dp1[m][n],dp2[m][n]);
}
return ;
}