Cod sursa(job #2210273)

Utilizator _Victor_Victor Ciobanu _Victor_ Data 5 iunie 2018 23:38:43
Problema Elimin Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream fin("elimin.in");
ofstream fout("elimin.out");
 
int A[900][900],B[900][900];
struct ran{
    int ord,val;
};
 
bool cmp(ran a,ran b){
    return a.val<b.val;
}
 
ran R[900],C[900],R2[900],C2[900];
long long s=0,s2=0;
int m,n,r,c;
   
int addc(int e){
	int sc=s;
	bool ok=true;
	for(int i=0;i<n;i++){
		C[i].ord=i;
		C[i].val=0;
	}
	for(int i = 0;i<m;i++)
     for(int j = 0;j<n;j++){
	 ok=true;
     for(int k=0; k<r-1; k++){
	 	if(i==R[k].ord)
		 ok=false;
	 }
		if(ok && e!=i){
			C[j].val+=A[i][j];
		}
	}
	sort(C,C+n,cmp); 
	
	for(int i = 0;i<c;i++)  
        sc-=C[i].val;
	return sc;
}

int addr(int e){
	int sc=s2;
	bool ok=true;
	for(int i=0;i<m;i++){
		R2[i].ord=i;
		R2[i].val=0;
	}
	for(int i = 0;i<m;i++){
	    for(int j = 0;j<n;j++){
			ok=true;
			for(int k=0; k<c-1; k++)
			if(j==C2[k].ord)
				ok=false;
		if(ok && e!=j){
			R2[i].val+=A[i][j];
		}
		} 
	}
    sort(R2,R2+m,cmp);  
	for(int i = 0;i<r;i++)  
        sc-=R2[i].val;
	return sc;
}
 
int main(){
    fin>>m>>n>>r>>c;
     
    for (int i = 0;i<m;i++){
        R[i].ord = R2[i].ord = i;
        for(int j = 0;j<n;j++){
            fin>>A[i][j];
            s+=A[i][j];
            s2+=A[i][j];
            if(!i) C[j].ord = C2[j].ord = j;
            C2[j].val+=A[i][j];  
            R[i].val+=A[i][j];
        }
    }
    sort(R,R+m,cmp);
    sort(C2,C2+n,cmp);
    
	 for(int i = 0;i<c;i++)  
        s2 -= C2[i].val;
    
	for(int i = 0;i<r;i++)  
        s-=R[i].val;
               
    int ad=s;
	ad=addc(R[r-1].ord);
    int i=r;
	while(R[i-1].val==R[i].val && i<n){
		int sc=addc(R[i].ord);
		if(ad<sc)
			ad=sc;
		i++;
	}
	s=ad;
	ad=addr(C2[c-1].ord);
    i=c;
	while(C2[i-1].val==C2[i].val && i<m){
		int sc=addr(C2[i].ord);
		if(ad<sc)
			ad=sc;
		i++;
	}
	s2=ad;
    fout<<max(s,s2);
    return 0;
}