Cod sursa(job #847029)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 3 ianuarie 2013 10:02:40
Problema Elimin Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

typedef unsigned (*ppf)(const vector<short>&,short,const vector<vector<short> >&);
unsigned process_rows(const vector<short> &comb, short c, const vector< vector<short> > &matr);
unsigned process_col(const vector<short> &comb, short r, const vector< vector<short> > &matr);
unsigned foreach_comb_getmax(short n,short k,short param,const vector<vector<short> > &matr,ppf procfunc);
inline unsigned sort_sum(vector<unsigned> &vec, short nrleave);

int main(){
    ifstream fin("elimin.in");
    ofstream fout("elimin.out");

    short m,n,r,c;
    fin>>m>>n>>r>>c;
    vector< vector<short> > matr(m,vector<short>(n));

    for(short i=0;i<m;++i)
        for(short j=0;j<n;++j) fin>>matr[i][j];

    if(m>n) fout<<foreach_comb_getmax(n,c,r,matr,process_col)<<'\n';
    else fout<<foreach_comb_getmax(m,r,c,matr,process_rows);
}

unsigned foreach_comb_getmax(short n,short k,short param,const vector<vector<short> > &matr,ppf procfunc){
    unsigned max=0;
    if(k==0) max=(*procfunc)(vector<short>(0),param,matr);
    else{
        short diff=n-k;
        vector<short> x(k,-1);
        short ki=0;
        k--;
        while(ki>-1){
            if(x[ki]==-1) if(ki==0) x[ki]=0; else x[ki]=x[ki-1]+1;
            else x[ki]++;

            if(x[ki]>diff+ki) x[ki--]=-1;
            else if(ki==k){unsigned c=(*procfunc)(x,param,matr); if(c>max) max=c;}
            else ki++;
        }
    }
    return max;
}
unsigned process_rows(const vector<short> &comb, short c, const vector< vector<short> > &matr){
    vector<unsigned> colsums(matr[0].size(),0);
    unsigned short counter=0;
    for(unsigned short i=0;i<matr.size();++i){
        bool what=true;
        if(counter<comb.size()) if(comb[counter]==i){++counter; what=false;}
        if(what) for(unsigned short j=0;j<matr[0].size();++j) colsums[j]+=matr[i][j];
    }
    return sort_sum(colsums,c);
}
unsigned process_col(const vector<short> &comb, short r, const vector< vector<short> > &matr){
    vector<unsigned> rowsums(matr.size(),0);
    unsigned short counter;
    for(unsigned short i=0;i<matr.size();++i){
        counter=0;
        for(unsigned short j=0;j<matr[0].size();++j){
            bool what=true;
            if(counter<comb.size()) if(comb[counter]==j){++counter; what=false;}
            if(what) rowsums[i]+=matr[i][j];
        }
    }
    return sort_sum(rowsums,r);
}
inline unsigned sort_sum(vector<unsigned> &vec, short nrleave){
    sort(vec.begin(),vec.end());
    unsigned ret=0;
    for(unsigned short i=nrleave;i<vec.size();++i) ret+=vec[i];
    return ret;
}