Pagini recente » Cod sursa (job #1164957) | Cod sursa (job #1520027) | Cod sursa (job #601898) | Cod sursa (job #2056273) | Cod sursa (job #7660)
Cod sursa(job #7660)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int n, m, r, c, i, j, t1[21][7301], t2[7301][21];
long s[7301],ss[7301],pow[21],max;
FILE *f;
void qsort(long l, long r)
{
long i,j,x,y;
i=l;
j=r;
x=ss[(l+r)/2];
do
{
while ((ss[i]<x)&&(i<r)) ++i;
while ((x<ss[j])&&(j>1)) --j;
if (i<=j)
{
y=ss[i];ss[i]=ss[j];ss[j]=y;
++i;
--j;
}
}
while (i<=j);
if (l<j) qsort(l,j);
if (i<r) qsort(i,r);
}
void normal()
{
long b,p,nr;
long k;
p=1 << n;
b=0;
while (b<p)
{
k=0;
nr = 0;
for (i=0;i<n;++i)
if ((b^pow[i])<b) ++k;
if (k==r)
{
memcpy(ss,s,sizeof(s));
for (i=0;i<n;++i)
if ((b^pow[i])<b)
for (j=1;j<=m;++j)
ss[j]-=t1[i+1][j];
qsort (1, m);
for (i=c+1;i<=m;++i)
nr += ss[i];
if (nr>max) max=nr;
}
++b;
}
}
void invers()
{
long b,p,nr;
long k;
p=1 << m;
b=0;
while (b<p)
{
k=0;
nr = 0;
for (i=0;i<m;++i)
if ((b^pow[i])<b) ++k;
if (k==c)
{
memcpy(ss,s,sizeof(s));
for (i=0;i<m;++i)
if ((b^pow[i])<b)
for (j=1;j<=n;++j)
ss[j]-=t2[j][i+1];
qsort (1, n);
for (i=r+1;i<=n;++i)
nr += ss[i];
if (nr>max) max=nr;
}
++b;
}
}
int main()
{
pow[0]=1;
max = 0;
for (i=1;i<21;++i)
pow[i] = pow[i-1] << 1;
f=fopen("elimin.in","r");
fscanf(f,"%d%d%d%d\n",&n,&m,&r,&c);
if (n<=m)
{
for (i=1;i<=n;++i)
{
for (j=1;j<=m;++j)
{
fscanf(f,"%d",&t1[i][j]);
s[j] += t1[i][j];
}
//fscanf(f,"\n");
}
normal();
}
else
{
for (i=1;i<=n;++i)
{
for (j=1;j<=m;++j)
{
fscanf(f,"%d",&t2[i][j]);
s[i] += t2[i][j];
}
//fscanf(f,"\n");
}
invers();
}
fclose(f);
f=fopen("elimin.out","w");
fprintf(f,"%ld",max);
fclose(f);
return 0;
}