Pentru fisierele sursa cu rezolvarile, verificati arhiva.
/**
 * Problema 2
 */
 
# include <stdio.h>

int main()
{
        int v[100], n, i, np, nn, sp, sn;

        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
                printf("v[%d] = ", i);
                scanf("%d", &v[i]);
        }

        nn = np = 0; // numarul de numere negative / pozitive
        sn = sp = 0; // suma numerelor negative / pozitive

        for (i = 0; i < n; i++)
                if (v[i] < 0) {
                        nn++;
                        sn += v[i];
                }
                else if (v[i] > 0) {
                        np++;
                        sp += v[i];
                }

        if (np == 0)
                printf("MP = nu se poate calcula\n");
        else
                printf("MP = %.2f\n", (float)sp / np);

        if (nn == 0)
                printf("MN = nu se poate calcula\n");
        else
                printf("MN = %.2f\n", (float)sn / nn);
                
        //fflush(stdin); getchar();

        return 0;
}


/**
 * Problema 3
 */

# include <stdio.h>
# include <limits.h>

int main()
{
        int a[100][100], n, m, i, j, max, min;

        printf("m = ");
        scanf("%d", &m);
        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < m; i++)
                for (j = 0; j < n; j++) {
                        printf("a[%d][%d] = ", i, j);
                        scanf("%d", &a[i][j]);
                }

        min = INT_MAX;
        for (i = 0; i < m; i++) {
                max = a[i][0];  // initializam maximul cu prima valoare de pe linia i
                for (j = 1; j < n; j++)
                        if (a[i][j] > max)
                                max = a[i][j];
                if (min > max)
                        min = max;
        }

        printf(/*"Punct in sa = */"%d\n", min);
        
        //fflush(stdin); getchar();

        return 0;
}


/**
 * Problema 4
 */

# include <stdio.h>

int main()
{
        int n, m, p, q, A[100][100], B[100][100], i, j, k;
        int C[100][100] = {0}; // toate valorile initializate la 0

        printf("m = ");
        scanf("%d", &m);
        printf("n = ");
        scanf("%d", &n);
        
        for (i = 0; i < m; i++)
                for (j = 0; j < n; j++)
                        scanf("%d", &A[i][j]);

        printf("p = ");
        scanf("%d", &p);
        printf("q = ");
        scanf("%d", &q);
        for (i = 0; i < p; i++)
                for (j = 0; j < q; j++)
                        scanf("%d", &B[i][j]);

        if (n != p) {
                printf("nu se poate efectua A * B"); // afisam mesaj
                return 0; // iesim din program
        }

        for (i = 0; i < m; i++)
                for (j = 0; j < q; j++)
                        for (k = 0; k < n; k++)
                                C[i][j] += A[i][k] * B[k][j];

        printf("%d %d\n", m, q);
        for (i = 0; i < m; i++) {
                for (j = 0; j < q; j++)
                        printf("%d ", C[i][j]);
                printf("\n");
        }

        //fflush(stdin); getchar();

        return 0;
}


/**
 * Problema 5
 */

# include <stdio.h>

int main()
{
        int n, m, i, j, k, A[100], B[100], C[100];

        //printf("n = ");
        scanf("%d", &n);
        //printf("m = ");
        scanf("%d", &m);        
        for (i = 0; i < n; i++) {
                //printf("A[%d] = ", i);
                scanf("%d", &A[i]);
        }

        for (i = 0; i < m; i++) {
                //printf("B[%d] = ", i);
                scanf("%d", &B[i]);
        }

        k = 0; // incepem sa construim noul vector
        i = 0;
        j = 0;
        while (i < n && j < m)
                if (A[i] < B[j]) { // daca elementul curent din A este mai mic
                        C[k] = A[i];
                        i++; // avansam in A
                        k++;
                }
                else {
                        C[k] = B[j];
                        j++; // avansam in B
                        k++;
                }
        // la sfarsit adaugam elementele ramase in A sau in B
        // tot timpul se va intra in cel mult unul din blocurile while
        while (i < n) {
                C[k] = A[i];
                i++;
                k++;
        }
        while (j < m) {
                C[k] = B[j];
                j++;
                k++;
        }

        for (i = 0; i < n + m; i++)
                printf("%d ", C[i]);
        printf("\n");

        //fflush(stdin); getchar();
        
        return 0;
}


/**
 * Problema 6
 */

# include <stdio.h>

int main()
{
        int n, A[100][100], B[100][100], i, j;

        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < n; i++)
                for (j = 0; j < n; j++)
                        scanf("%d", &A[i][j]);

        for (j = 1; j < n; j++){
                for (i = n - j; i < n; i++)
                        printf("%d ", A[i][j]);
                //printf("\n");
        }

        printf("\n");
        
        //fflush(stdin); getchar();

        return 0;
}


/**
 * Problema 7
 */

# include <stdio.h>

int main()
{
        int V[100], n, i, max, maxstart, start;

        printf("n = ");
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
                //printf("V[%d] = ", i);
                scanf("%d", &V[i]);
        }

        max = 0; maxstart = -1;
        start = 0; // pozitia de start
        for (i = 1; i < n; i++)
                if (V[i - 1] > V[i]) {        // daca secventa nu mai e crescatoare
                        if (i - start > max) {       // verificam daca avem un nou maxim
                                max = i - start;
                                maxstart = start;
                        }
                        start = i;
                }

        for (i = maxstart; i < maxstart + max; i++)
                printf("%d ", V[i]);
        printf("\n");
        
        return 0;
}


/**
 * Problema 8
 */
 
#include <stdio.h>

int main(){
    // Vom retine in vectorul bestSumEndingHere[] valoarea maxima a unei secvente care se termina
    // pe pozitia "i" in vectorul initial (indiferent de cat de departe se extinde spre stanga)
    int n, v[100], bestSumEndingHere[100], i, max, pmax, sum;
    
    // Citirea datelor de intrare
    scanf("%d", &n);
    for(i = 0; i < n; i++)
          scanf("%d", &v[i]);

    // Observam ca daca am sti valoarea lui bestSumEndingHere[i-1], atunci am putea profita de acest
    // lucru pentru a deduce rapid valoarea maxima a unei subsecvente care se termina pe pozitia "i"
    // in vectorul initial. Stim deja ca bestSumEndingHere[i-1] reprezinta suma MAXIMA a unei subsecvente
    // care se termina pe pozitia "i-1" in vectorul initial (deci mai bine de atat nu se poate), astfel ca
    // practic avem doar doua posibilitati:
    //
    // 1) Sa "alipim" pe v[i] la acea subsecventa care se termina la "i-1"
    //
    // 2) Sa "aruncam" secventa care se termina la "i-1" si sa incepem una noua doar cu v[i]
    //
    // Deoarece ne intereseaza ca suma finala sa fie cat mai mare, vom alege a doua varianta doar daca suma
    // maxima a unei subsecvente care se termina la "i-1" este negativa (si deci, mai mult incurca decat sa
    // ne ajute).
    //
    // Pentru afisare, mai retinem si lungimile asociate si pozitiile unei am gasit cea mai buna solutie.
          
    bestSumEndingHere[0] = 0;
    int bestEndingOverall = 0;
    int associatedLength = 1;
    int currentLength = 1;
    for(i = 1; i < n; i++){
        // Decidem ce e mai bine: sa adaugam la secventa sau sa incepem alta noua
        if (bestSumEndingHere[i-1] > 0) {
            bestSumEndingHere[i] = bestSumEndingHere[i-1] + v[i];
            currentLength++;
        } else {
            bestSumEndingHere[i] = v[i];
            currentLength = 1;
        }
        // Decidem daca nu cumva am obtinut o solutie mai buna decat tot ce am vazut
        // pana acum
        if (bestSumEndingHere[i] > bestSumEndingHere[bestEndingOverall]){
            bestEndingOverall = i;
            associatedLength = currentLength;
        }
    }
    
    //afisarea solutiei
    for(i = bestEndingOverall-associatedLength+1; i <= bestEndingOverall; i++)
          printf("%d ", v[i]);
    printf("\n");

    // P.S. In practica, este foarte incomod sa dati nume asa de lungi la variabile. Aici am scris asa doar
    // pentru a incerca o rezolvare cat mai clara ;).
    
    return 0;
}