Cod sursa(job #2081573)

Utilizator BazagazealOancea Eduard Bazagazeal Data 4 decembrie 2017 20:36:47
Problema Subsir crescator maximal Scor 35
Compilator c Status done
Runda Arhiva educationala Marime 4.3 kb
#include <stdio.h>
#include <stdlib.h>

//Sume partiale:N numere, K query-uri:sum(i,j)
void sume_partiale_vector(){
    int n,k,i,first,last,m=-1;
    FILE *f=fopen("sumepartiale.txt", "r");
    fscanf(f,"%d%d", &n, &k);
    int *v1=(int*)malloc(sizeof(int)*n);
    int *v2=(int*)malloc(sizeof(int)*n);
    int *v3=(int*)malloc(sizeof(int)*k);
    for(i=0;i<n;i++)
        fscanf(f,"%d", &v1[i]);
    v2[0]=v1[0];
    for(i=1;i<n;i++)
        v2[i]=v2[i-1]+v1[i];
    for(i=0;i<k;i++){
        fscanf(f,"%d%d", &first,&last);
        if(first>last){
            int aux=first;
            first=last;
            last=aux;
        }
        if(first)
            v3[++m]=v2[last]-v2[first-1];
            else v3[++m]=v2[last];
    }
    for(i=0;i<k;i++)
        printf("%d\n", v3[i]);
}

//Sume partiale:NxN numere, K query-uri:sum((l1,c1),(l2,c2))
void sume_partiale_matrice(){
    int i,j,n,m,k,c1,c2,l1,l2,m1[101][101],m2[101][101],g,aux;
    FILE *f=fopen("sumepartiale^2.txt", "r");
    fscanf(f,"%d%d%d", &n, &m, &k);
    int *sol=(int*)malloc(sizeof(int)*k);
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            fscanf(f,"%d", &m1[i][j]);
    for(i=0;i<n;i++){
        for(j=0;j<m;j++)
            printf("%d ", m1[i][j]);
        printf("\n");
    }
    m2[0][0]=m1[0][0];
    for(i=1;i<n;i++)
        m2[i][0]=m2[i-1][0]+m1[i][0];
    for(j=1;j<m;j++)
        m2[0][j]=m2[0][j-1]+m1[0][j];
    for(i=1;i<n;i++)
        for(j=1;j<m;j++)
            m2[i][j]=m1[i][j]+m2[i-1][j]+m2[i][j-1]-m2[i-1][j-1];
    for(g=0;g<k;g++){
        fscanf(f,"%d%d%d%d", &l1, &c1, &l2, &c2);
        if(c1>c2){
            aux=c1;
            c1=c2;
            c2=aux;
        }
        if(l1>l2){
            aux=l1;
            l1=l2;
            l2=aux;
        }
        if(l1==0 && c1==0)
            sol[g]=m2[l2][c2];
            else if(l1!=0 && c1==0)
                sol[g]=m2[l2][c2]-m2[l1-1][c2];
            else if(l1==0 && c2!=0)
                sol[g]=m2[l2][c2]-m2[l2][c1-1];
            else sol[g]=m2[l2][c2]-m2[l1-1][c2]-m2[l2][c1-1]+m2[l1-1][c1-1];
    }
    for(g=0;g<k;g++)
        printf("%d ", sol[g]);
}
int subsecventa_suma_maxima()
{
    int sum=0,i,max=0,n;
    FILE *f=fopen("subsecventa.txt", "r");
    fscanf(f,"%d", &n);
    int *x=(int*)malloc(sizeof(int)*n);
    for(i=0;i<n;i++)
        fscanf(f,"%d", &x[i]);
    for(i=0;i<n;i++)
        printf("%d ", x[i]);
    printf("\n");
    for(i=0;i<n;i++){
        if(max<sum)
            max=sum;
        sum+=x[i];
        if(sum<0)
            sum=0;
    }
    printf("%d", max);
}

void subsir_crescator_maximal()
{
    FILE *f=fopen("scmax.in", "r");
    FILE *g=fopen("scmax.out", "w");
    int n,i,pos_max=1,j,ok,max,index;
    fscanf(f,"%d", &n);
    int *x=(int*)malloc(sizeof(int)*n);
    int *d=(int*)malloc(sizeof(int)*n);
    int *p=(int*)malloc(sizeof(int)*n);
    int *bulaneala=(int*)malloc(sizeof(int)*n);
    for(i=0;i<n;i++)
        fscanf(f,"%d ", &x[i]);
    d[0]=-1;
    p[0]=-1;
    d[1]=x[0];
    for(i=1;i<n;i++){
        j=1;
        ok=0;
        while(j<=pos_max && !ok){
            if(x[i]<d[j]){
                ok=1;
                d[j]=x[i];
                bulaneala[j]=i;
            }
            else j++;
        }
        if(!ok){
            pos_max++;
            d[pos_max]=x[i];
            bulaneala[pos_max]=i;
        }
    }
    for(i=1;i<n;i++){
        max=-1;
        index=-1;
        for(j=0;j<i;j++)
            if(x[j]<x[i] && max<x[j]){
                max=x[j];
                index=j;
            }
        p[i]=index;
    }
    int *sol=(int*)malloc(sizeof(int)*pos_max);
    sol[0]=d[pos_max];
    ok=0;
    for(j=n-1;j>=0 && !ok;j--)
        if(x[j]==sol[0])
        {
            index=j;
        }
    int bulanation=bulaneala[pos_max];
    sol[0]=x[bulanation];
    i=1;
    while(p[bulanation]!=-1){
        bulanation=p[bulanation];
        sol[i]=x[bulanation];
        i++;
    }
  /*  for(i=1;i<=pos_max;i++)
        printf("%d ", bulaneala[i]);
    printf("\n");
    for(i=0;i<n;i++)
        printf("%d ", p[i]);
    printf("\n");*/
    fprintf(g,"%d\n", pos_max);
    for(i=pos_max-1;i>=0;i--)
        fprintf(g,"%d ", sol[i]);
}
int main(){
    subsir_crescator_maximal();
    return 0;
}