fbpx

Problema #763 – Matrice3 – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă o matrice cu n linii și m coloane și elemente numere naturale și o valoare k. Să se modifice cel mult k elemente ale matricei, astfel încât toate liniile matricei să aibă aceeași sumă a elementelor.

Date de intrare

Programul citește de la tastatură numerele n m k, apoi elementele matricei, linie cu linie.

Date de ieșire

Programul va afișa pe ecran numărul numărul de elemente modificate, p, apoi p triplete i j x, cu semnificația: elementul din matrice de pe linia i și coloana j devine x. x trebuie să fie număr natural.

Restricții și precizări

  • 1 ≤ n , m ≤ 100
  • 1 ≤ k < n
  • elementele matricei vor fi mai mici decât 1.000.000
  • liniile și coloanele matricei sunt numerotate de la 1
  • pentru toate datele de test există soluție

Exemplu

Intrare

3 4 2
7 4 1 6
5 5 7 3
4 7 2 3

Ieșire

2
1 3 3
3 1 8
#include <bits/stdc++.h>
using namespace std;
int a1[101], a2[101], a3[101] , p , x;
int main()
{


   int n, m, k, a[101][101];
   cin >> n >> m >> k;
   for(int i = 1; i <= n ; i++)for(int j = 1; j <= m; j++) cin >> a[i][j];
   for(int i = 1; i <= n ; i++)
    {
        a[i][0] = 0;
        for(int j = 1; j <= m ; j++) a[i][0] += a[i][j];
    }
   if(k == n-1)
   {
       int s1 = 0;
       for(int i = 1; i <= n; i++) if(a[i][0] > s1) s1 = a[i][0];
       for(int i = 1; i <= n; i++)
        if(a[i][0] != s1)
       {
           int jmin = 1;
           for(int j = 2; j <= m ; j++) if(a[i][j] < a[i][jmin]) jmin = j;
           p++;
           a1[p] = i;
           a2[p] = jmin;
           a3[p] = a[i][jmin] + s1 - a[i][0];
       }
   }
   else
    {
        int s = 0;
        for(int i = 1; i <= n ; i++)
        {
            int cnt =1;
            for(int j = 1; j <= n; j++) if(a[i][0] == a[j][0])cnt++;
            if(cnt >=n - k) s = a[i][0];
        }

       for(int i=1; i<=n; i++)
        if(a[i][0] < s)
       {
           int jmin = 1;
           for(int j = 2; j <= m; j++) if(a[i][j] < a[i][jmin])jmin = j;
           a[i][jmin] += s-a[i][0];
           p++;
           a1[p] = i;
           a2[p]= jmin;
           a3[p] = a[i][jmin];
       }
       else
        while(a[i][0] > s)
       {
           int jmax = 1;
           for(int j = 2; j <= m; j++)if(a[i][j] > a[i][jmax]) jmax = j;
           if(a[i][0] - s <= a[i][jmax]) x = a[i][0] - s;
           else x = a[i][jmax];
           a[i][jmax] -= x;
           a[i][0] -=x;
           p++;
           a1[p] = i;
           a2[p] = jmax;
           a3[p] = a[i][jmax];

       }

    }
   cout << p << endl;
   for(int i = 1 ; i <= p ; i++)
    cout << a1[i] << " " << a2[i] << " " << a3[i] << endl;



    return 0;
}
Comentarii

S-ar putea sa iti placa