Cod sursa(job #2062140)

Utilizator donydony2010George Donisan donydony2010 Data 10 noiembrie 2017 00:14:43
Problema Elimin Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.04 kb
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;
 
struct SumEntry{
    SumEntry(int val, int index) : m_Value(val), m_Index(index){}
    int m_Value;
    int m_Index;
};
 
bool CompareSumEntry(const SumEntry& a, const SumEntry& b)
{
    return a.m_Value < b.m_Value;
}
 
int ExtraWeightRemoveColumn(const vector<vector<int>>& matrix, const vector<SumEntry>& columns, const vector<SumEntry>& rows, int index, int rowsToBeRemoved)
{
    vector<SumEntry> newRows(rows);
    for(int i = 0; i < newRows.size(); i++)
    {
        newRows[i].m_Value -= matrix[i][index];
    }
 
    sort(newRows.begin(), newRows.end(), CompareSumEntry);
 
    int sum = 0;
    for(int i = 0; i < rowsToBeRemoved; i++)
    {
        sum += newRows[i].m_Value;
    }
    return sum;
}
 
void RemoveColumn(const vector<vector<int>>& matrix, vector<SumEntry>& columns, vector<SumEntry>& rows, int index, int realIndex)
{
    for(int i = 0; i < rows.size(); i++)
    {
        rows[i].m_Value -= matrix[i][realIndex];
    }
 
    columns.erase(columns.begin() + index);
}
 
int Solve(int m, int n, int r, int c, const vector<vector<int>>& matrix)
{
    vector<SumEntry> columnSum(n, SumEntry(0, 0));
    vector<SumEntry> rowSum(m, SumEntry(0, 0));
 
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
        {
            columnSum[j].m_Value += matrix[i][j];
            rowSum[i].m_Value += matrix[i][j];
            columnSum[j].m_Index = j;
            rowSum[i].m_Index = i;
        }
    }
 
    for(int i = 0; i < c; i++)
    {
        int minIndex = 0;
        int min = 0x3f3f3f3f;
        for(int j = 0; j < columnSum.size(); j++)
        {
            int sum = columnSum[j].m_Value + ExtraWeightRemoveColumn(matrix, columnSum, rowSum, columnSum[j].m_Index, r);
            if(min > sum)
            {
                min = sum;
                minIndex = j;
            }
        }
        RemoveColumn(matrix, columnSum, rowSum, minIndex, columnSum[minIndex].m_Index);
    }
 
    sort(rowSum.begin(), rowSum.end(), CompareSumEntry);
 
    int sum = 0;
    for(int i = r; i < m; i++)
    {
        sum += rowSum[i].m_Value;
    }
    return sum;
}

int DoubleSolve(int m, int n, int r, int c, vector<vector<int>> matrix)
{
	vector<vector<int>> matrix1;
	for(int i = 0; i < n; i++)
    {
        matrix1.push_back(vector<int>());
        for(int j = 0; j < m; j++)
        {
            matrix1[i].push_back(matrix[j][i]);
        }
    }
    return max(Solve(m, n, r, c, matrix), Solve(n, m, c, r, matrix1));
}
 
int main()
{
    vector<vector<int>> matrix;
    vector<vector<int>> matrix1;
    int m, n, r, c;
    ifstream f("elimin.in");
    ofstream g("elimin.out");
    f >> m >> n >> r >> c;
 
    for(int i = 0; i < m; i++)
    {
        matrix.push_back(vector<int>());
        for(int j = 0; j < n; j++)
        {
            int x;
            f >> x;
            matrix[i].push_back(x);
        }
    }

    g << DoubleSolve(m, n, r, c, matrix);
}