Cod sursa(job #287000)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 24 martie 2009 13:51:27
Problema Tricouri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int v[25][25][10], s[7][110], n, m, k, p;

int main()
{
    freopen("tricouri.in","r",stdin);
	freopen("tricouri.out","w",stdout);
	scanf("%d %d",&n,&m);
	int i, x, j, y;
	for (i=1; i<=n; i++)
	{
	    scanf("%d",&x);
		for (j=2; j<21; j++)
        {
			k=x%j;
			p=0;
			for (y=1; y<=v[j][k][0]; y++)
			    if (x>=v[j][k][y])
				{
				    p=y;
					break;
                }
            if (p==0) p=v[j][k][0]+1;
        	for (y=5; y>=p; y--) v[j][k][y+1]=v[j][k][y];
			v[j][k][p]=x;
			v[j][k][0]++;
			v[j][k][0]=min(v[j][k][0],5);
        }
    }
	int c, r;
	while (m--)
	{
		scanf("%d %d",&k,&p);
		n=k*(p-1);
		for (y=0; y<p; y++)
		    for (c=1; c<=min(k,v[p][y][0]); c++)
        		for (i=k; i>0; i--)
	        	    for (j=n-y; j>=0; j--)
		        		if (s[i-1][j] || (i==1 && j==0))
						    s[i][j+y]=max(s[i][j+y],s[i-1][j]+v[p][y][c]);
		r=-1;
		for (i=0; i<=n; i++)
		    if (!(i %p) && s[k][i])
			    r=max(r,s[k][i]);
        printf("%d\n",r);
		for (i=0; i<=k; i++)
		    for (j=0; j<=n; j++) s[i][j]=0;
    }
}