Pagini recente » Istoria paginii summer-challenge-21/solutii/portale | Clasament super_tare_frate | Monitorul de evaluare | bob | Cod sursa (job #847029)
Cod sursa(job #847029)
#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;
}