Cod sursa(job #2704622)

Utilizator gasparrobert95Gaspar Robert Andrei gasparrobert95 Data 10 februarie 2021 20:45:14
Problema Economie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("economie.in");
ofstream fout("economie.out");
int n, dim, v[1005];
bool pd[50005];
vector <int> aux;

int main() {
    fin >> n;
    for (int i = 1; i <= n; ++i) {
        fin >> v[i], dim = max(dim, v[i]);
        aux.push_back(v[i]);
    }
    sort(aux.begin(), aux.end());
    n = 0;
    for (int i = 0; i < aux.size(); ++i)
        if (v[n] != aux[i])
            ++n, v[n] = aux[i];
    int st = 1, dr = n, rez = 0;
    while (st <= dr) {
        int mij = (st + dr) / 2;
        memset(pd, 0, sizeof(pd));
        for (int i = 1; i <= mij; ++i)
            pd[v[i]] = 1;
        for (int i = 1; i <= dim; ++i) {
            if (!pd[i])
                continue;
            for (int j = 1; j <= mij; ++j) {
                if (i + v[j] <= dim)
                    pd[i + v[j]] = true;
                else
                    break;
            }
        }
        bool ok = true;
        for (int i = mij + 1; i <= n; ++i)
            if (!pd[v[i]]) {
                ok = false;
                break;
            }
        if (ok)
            rez = mij, dr = mij - 1;
        else
            st = mij + 1;
    }
    fout << rez << "\n";
    for (int i = 1; i <= rez; ++i)
        fout << v[i] << "\n";
    return 0;
}