Cod sursa(job #23765)

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

using namespace std;

const int maxn = 300000;

vector <int> vect[40];

int max;
int p,k;
int i;
int j,m;
int s[maxn];
int n;
int l;
int a[maxn];
int ver[maxn];
int marime;
int maxi;


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

                int i1 = 1;
                int 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;
                        it = vect[s[j]].begin();
                        marime = vect[s[j]].size();
                        l = 0;
                        while(ver[*it] != 0)
                        {
                                ++l;
                                if (l>=marime)
                                {
                                        memset(ver,0,sizeof(ver));
                                        return ;
                                }
                                ++it;
                        }
                        if (l == marime) return ;
                        int f = a[*it];

                        sum += f;
                        ver[*it]=1;
                }
                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);
        for(i=1;i<=n;i++)
        {
                scanf("%d", &a[i]);
        }
        for( i = 1;i <= m; ++i)
        {
                scanf("%d %d",&p,&k);
                maxi = 0;
                for(j = 1; j <= n; ++j)
                {
                        vect[a[j]%k].push_back(j);
                }
                for(j = 0;j <= k; ++j)
                {
                        sort(vect[j].begin(), vect[j].end(), cmpf);
                }
                bkt(1);
                for(j = 0; j <= k; ++j )
                {
                        vect[j].clear();

                }
                if (maxi>0) printf("%d\n",maxi);
                        else
                        {
                                printf("-1\n");
                        }
        }
        return 0;
}