Cod sursa(job #1489354)

Utilizator linia_intaiConstantinescu Iordache Ciobanu Noi cei din linia intai linia_intai Data 20 septembrie 2015 23:57:32
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.09 kb
#include <iostream>
#include <algorithm>
#include <cmath>

#define double long double
#define lint long long int
using namespace std;

const int eps = 1e-8l;

class System {
public:
    static const int NMAX = 205;

    int n;
    double mat[NMAX][NMAX];

    double c[NMAX];
    int b_max;

    inline void GaussJordan () {
        int lin;
        for (int col = 1; col < n; ++ col) {
            for (lin = col; lin < n; ++ lin) {
                if (fabs(mat[lin][col]) >= eps) {
                    _swap(col, lin);
                    break;
                }
            }

            scale(col, mat[col][col]);

            for (lin = col + 1; lin < n; ++ lin)
                subtract(lin, mat[lin][col], col);
        }

        for (int col = n - 1; col; -- col)
            for (lin = col - 1; lin; -- lin)
                subtract(lin, mat[lin][col], col);
    }

    inline void solve () {
        int i;
        double x;

        lint ans = -1;
        lint total_c;

        for (int xn = 0; xn <= b_max; ++ xn) {
            cout << "il incerc pe xn " << xn << endl;
            total_c = xn * c[n];

            for (i = n - 1; i; -- i) { //Variabila curenta
                x = mat[i][n + 1] - xn * mat[i][n]; //Valoarea variabilei curente
                if (x <= -eps || fabs(x - round(x)) >= eps)
                    break;

                total_c += round(x) * c[i];
            }

            if (!i && total_c > ans)
                ans = total_c;
        }

        cout << ans << '\n';
    }

    inline void read () {
        cin >> n;
        //if (n == 1) { Ce facem aici? }

        for (int i = 1; i <= n; ++ i)
            cin >> c[i];

        for (int i = 1; i < n; ++ i)
            cin >> mat[i][n + 1];

        b_max = -1;
        for (int i = 1; i < n; ++ i)
            if (mat[i][n + 1] > b_max)
                b_max = mat[i][n + 1];

        int j;
        for (int i = 1; i < n; ++ i)
            for (j = 1; j <= n; ++ j)
                cin >> mat[i][j];
    }

    inline void print () {
        cout << "Sistemul este:" << endl;
        int j;
        for (int i = 1; i < n; ++ i) {
            for (j = 1; j <= n + 1; ++ j)
                cout << mat[i][j] << ' ';
            cout << '\n';
        }
        cout << endl;
    }

private:
    inline void _swap (int lin1, int lin2) {
        for (int i = 1; i <= n + 1; ++ i)
            swap(mat[lin1][i], mat[lin2][i]);
    }

    inline void scale (int lin, double alpha) {
        for (int i = 1; i <= n + 1; ++ i)
            mat[lin][i] /= alpha;
    }

    inline void subtract (int lin_dest, double alpha, int lin_source) {
        for (int i = 1; i <= n + 1; ++ i)
            mat[lin_dest][i] -= alpha * mat[lin_source][i];
    }
};

int main()
{
    ios_base :: sync_with_stdio(false);

    int t = 1;
    //cin >> t;

    while (t --) {
        System sis;

        sis.read();
        sis.GaussJordan();

        cout << "Dupa Gauss" << endl;
        sis.print();

        sis.solve();
    }

    return 0;
}