Cod sursa(job #52245)

Utilizator chermanCorina Herman cherman Data 18 aprilie 2007 10:39:02
Problema Elimin Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <stdio.h>
#include <iostream>

FILE *in = fopen("elimin.in","r"), *out = fopen("elimin.out","w");

int n, m, r, c;
int a[600][600];
int eliminate[600] = {0};
int st[600];


int ss = 0;

int poz(int p, int u, int b[])
{
	int s=p, d=u, x=b[p];
	while ( s < d )
	{
		while ( b[d] >= x && s < d )
			--d;
		b[s] = b[d];
		while ( b[s] <= x && s < d )
			++s;
		b[d] = b[s];
	}
	b[s] = x;
	return s;
}

void qs(int p, int u, int b[])
{
	int m = poz(p, u, b);
	if ( p < m )
		qs(p, m-1, b);
	if ( m < u )
		qs(m+1, u, b);
}

void read()
{
    fscanf(in, "%d %d %d %d", &m, &n, &r, &c);

    for ( int i = 1; i <= m; ++i )
        for ( int j = 1; j <= n; ++j )
            fscanf(in, "%d" , &a[i][j]);
}

void suma()
{
    int t = 0;
    int b[600] = {0};
    int bb[600] = {0};

//    for ( int i = 1; i <= c; ++i )
//    printf("%d ",st[i]);
//    printf("\n");

    int kk=1;
    for ( int i = 1; i <= m; ++i )
    {
        int k=1;
        for ( int j = 1; j <= n; ++j )
        {
                while(st[k]<j &&k<c)k++;
                if (st[k]!=j)
                b[i] += a[i][j];
        }
      if(kk<m-r)
       bb[kk++]=b[i];
      else
       for(int ii=1;ii<=m-r;ii++)
         if(b[i]>bb[ii])
         {
             bb[ii]=b[i];
             break;
         }
    }

//    qs(1, m, b);
//
//    for ( int i = 1; i <= m; ++i )
//    printf("%d ",b[i]);
//    printf("**\n");
//
//    for ( int i = r+1; i <= m; ++i )
//        t += b[i];

    for ( int i = 1; i <= m-r; ++i )
        t += bb[i];

    if ( t > ss )
        ss = t;


}

void back(int col)
{
    for ( int i = st[col-1]+1; i <= n; ++i )
    {
        st[col] = i;
        if ( col == c )
        {

            suma();
        }
        else
            back(col+1);
    }
}

int main()
{
    read();
    back(1);


    fprintf(out, "%d\n", ss);

	return 0;
}