Pagini recente » Cod sursa (job #2064966) | Cod sursa (job #2593469) | Cod sursa (job #1193806) | Cod sursa (job #461289) | Cod sursa (job #2680840)
#include <stdio.h>/// am inversat n cu m din greseala
#include <vector>///incerc aceeasi simulare pe coloane
using namespace std;
#define MAXARIE 7294
#define MAXEL 32000
vector <int> mat[MAXARIE];
vector <int> v;
vector <int> sc;
int frecv[7294];
int mins = MAXEL * MAXARIE + 1, n, m, r, c;
void quickselect(int mi, int ma, int poz){
int b, e, piv, aux;
b = mi;
e = ma;
piv = v[(mi + ma) / 2];
while(piv > v[b]){
b++;
}
while(piv < v[e]){
e--;
}
while(b < e){
aux = v[b];
v[b] = v[e];
v[e] = aux;
do{
b++;
}while(piv > v[b]);
do{
e--;
}while(piv < v[e]);
}
if((poz <= e) && (mi < e)){
quickselect(mi, e, poz);
}else if((e + 1) < ma){
quickselect(e + 1, ma, poz);
}
}
void combinari(int col, int ac, int s){
int l;
if(ac < c){
for(; col < (m - c + ac + 1); col++){
frecv[col] = 1;
combinari(col + 1, ac + 1, s + sc[col]);
frecv[col] = 0;
}
}else{
for(col = 0; col < n; col++){
if(frecv[col] == 0){
for(l = 0; l < m; l++){
v[l] += mat[l][col];
}
}
}
quickselect(0, n - 1, r);
for(l = 0; l < r; l++){
s += v[l];
v[l] = 0;
}
for(; l < n; l++){
v[l] = 0;
}
if(s < mins){
mins = s;
}
}
}
int main()
{
FILE *fin, *fout;
int l, col, el, stotal;
fin = fopen("elimin.in", "r");
fscanf(fin, "%d%d%d%d", &n, &m, &r, &c);
stotal = 0;
for(l = 0; l < n; l++){
for(col = 0; col < m; col++){
fscanf(fin, "%d", &el);
stotal += el;
mat[l].push_back(el);
if(l == 0){
sc.push_back(el);
}else{
sc[col] += el;
}
}
}
fclose(fin);
for(l = 0; l < n; l++){
v.push_back(0);
}
combinari(0, 0, 0);
fout = fopen("elimin.out", "w");
fprintf(fout, "%d", stotal - mins);
fclose(fout);
return 0;
}