Cod sursa(job #961059)

Utilizator primulDarie Sergiu primul Data 11 iunie 2013 16:39:47
Problema Tricouri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
 
#define INF 1000000005
#define RMAX 23
#define NMAX 300005
 
int f[RMAX],numere[RMAX][7];
int v[NMAX],n,m;
int d[RMAX][RMAX][7][RMAX];
 
int main ()
{
    int i,j,p,k,t,r,newr,a,b,val;
 
    freopen("tricouri.in","r",stdin);
    freopen("tricouri.out","w",stdout);
 
    scanf("%d%d",&n,&m);
    for(i = 1; i <= n; i++)
        scanf("%d",&v[i]);
    sort(v + 1, v + n + 1);
    for(i = 2; i <= 20; i++)
    {
        for(j = 0; j < i; j++)
            f[j] = 0;
        for(j = n; j >= 1; j--)
        {
            val = v[j] % i;
            if(f[val] < 5)
                numere[val][++f[val]] = v[j];
        }
        for(j = 0; j < i; j++)
            for(k = 1; k <= f[j]; k++)
                numere[j][k] += numere[j][k - 1];
        for(p = 0; p <= i; p++)
            for(j = 0; j <= 5; j++)
                for(r = 0; r <= i; r++)
                    d[i][p][j][r] = -INF;
        for(j = 0; j <= 20; j++)
            d[i][j][0][0] = 0;
        for(p = 1; p <= i; p++)
            for(j = 1; j <= 5; j++)
                for(r = 0; r < i; r++)
                    for(t = 0, newr = r; t <= j && t <= f[p - 1]; t++)
                    {
                        d[i][p][j][r] = max(d[i][p][j][r], d[i][p - 1][j - t][newr] + numere[p - 1][t]);
                        newr -= (p - 1);
                        if(newr < 0)
                            newr += i;
                    }
 
    }
 
    for(i = 1; i <= m; i++)
    {
        scanf("%d%d",&a,&b);
        if(d[b][b][a][0] < 0)
            printf("-1\n");
        else
            printf("%d\n",d[b][b][a][0]);
    }
 
    return 0;
}