1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    long long h, w;
    int n;  cin >> h >> w >> n;

    if (h <= 0 || w <= 0) { 
        cout << -1 << endl;
        return 0;
    }

    vector<long long> d(n);
    for (int i = 0; i < n; ++i) {
        cin >> d[i];
        if (d[i] < 0) { 
            cout << -1 << endl;
            return 0;
        }
    }

    long long pole_sciany = h * w;
    sort(d.rbegin(), d.rend());
    long long pole_obrazu_najwiekszego = d[0] * d[0];
    long long reszta_pola = pole_sciany % pole_obrazu_najwiekszego;

    if (reszta_pola == 0) {
        cout << pole_sciany / pole_obrazu_najwiekszego << endl;
        return 0;
    }
    long long liczba_obrazow = pole_sciany / pole_obrazu_najwiekszego;

    for (int i = 1; i < n; ++i) {
        if (d[i] * d[i] <= reszta_pola) {
            reszta_pola -= d[i] * d[i];
            ++liczba_obrazow;
        }
    }

    cout << liczba_obrazow << endl;

    return 0;
}