Cod sursa(job #24239)

Utilizator mariusdrgdragus marius mariusdrg Data 1 martie 2007 22:37:55
Problema Tricouri Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.88 kb
#include<stdio.h>
#include<vector>
#include<algorithm>

using namespace std;


int a[25][25][10];

int max;
int p,k;
int ver[21][21][10];
int i;
int j,m;
int n;
int s[10];
int l;
int marime;
int sum;
int nr1;
int maxi;


void bkt(int i)
{
        if (i<p)
        {
                for(s[i] = 0;s[i] <= k; ++s[i])
                {
                        bkt(i+1);
                }
        }
        else
        {

                int i1 = 1;
                sum = 0;
                for(i1 = 1; i1 <= p-1 ; ++i1)
                        sum += s[i1];
                s[p]=(k-sum%k)%k;
                sum = 0;
                for(j = 1;j <= p; ++j )
                {
                        vector <int> :: iterator it;

                        marime = a[k][s[j]][0];
                        l = marime;
                        

                        while(ver[k][s[j]][l] != 0)
                        {
                                --l;
                                if (l <= 0)
                                {
                                        memset(ver,0,sizeof(ver));
                                        return ;
                                }
                        }
                        ver[k][s[j]][l] = 1;
                        sum += a[k][s[j]][l];
                }
                if (sum > maxi)
                {
                        maxi = sum;
                }
                
        }
}

bool cmpf(const int &i,const int &b)
{
        return a[i]>a[b];
}


int main()
{
        freopen("tricouri.in","r",stdin);
        freopen("tricouri.out","w",stdout);
        scanf("%d %d",&n,&m);
        int x;
        for(i=1;i<=n;i++)
        {
                scanf("%d", &x);
                for(j = 2;j <= 20; ++j)
                {
                        nr1 = x % j;
                        k = 1;
                        if (a[j][nr1][0]<=5)
                        {
                                a[j][nr1][0]++;
                                a[j][nr1][a[j][nr1][0]]=x;
                                sort(a[j][nr1]+1,a[j][nr1]+a[j][nr1][0]+1);
                                continue;
                        }
                        if (a[j][nr1][1] <= x)
                        {
                                a[j][nr1][1] = x;
                                sort(a[j][nr1]+1,a[j][nr1]+a[j][nr1][0]+1);
                                continue;
                        }
                        
                }
        }
        for( i = 1;i <= m; ++i)
        {
                scanf("%d %d",&p,&k);
                maxi = 0;
                bkt(1);
                if (maxi>0) printf("%d\n",maxi);
                        else
                        {
                                printf("-1\n");
                        }
        }
        return 0;
}