Cod sursa(job #1781518)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 16 octombrie 2016 22:33:44
Problema Lapte Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#define MAXN 100
int timp[MAXN][2], d[MAXN+1][MAXN+1], path[MAXN+1][MAXN+1][MAXN][2];

inline int val(int a, int b, int poz){
  return path[a][b][poz][0]*timp[poz][0]+path[a][b][poz][1]*timp[poz][1];
}

inline int max(int a, int b){
  return a>b ? a:b;
}

inline int calcul(int a, int b, int ind, int n){
  int i, min=2000000000, poz;
  for(i=0;i<n;i++)
    if(min>val(a,b,i)+timp[i][ind]){
      min=val(a,b,i)+timp[i][ind];
      poz=i;
    }
  return poz;
}

inline void copi(int a1, int b1, int a2, int b2, int n){
  for(int i=0;i<n;i++){
    path[a1][b1][i][0]=path[a2][b2][i][0];
    path[a1][b1][i][1]=path[a2][b2][i][1];
  }
}

int main()
{
  int i, n, L, a, b, poz1, poz2;
  FILE *fi=fopen("lapte.in", "r"), *fo=fopen("lapte.out", "w");
  fscanf(fi, "%d%d", &n, &L);
  for(i=0;i<n;i++){
    fscanf(fi, "%d%d", &timp[i][0], &timp[i][1]);
  }
  for(a=1;a<=L;a++){
    poz1=calcul(a-1,0,0,n);
    d[a][0]=max(d[a-1][0],val(a-1,0,poz1)+timp[poz1][0]);
    copi(a,0,a-1,0,n);
    path[a][0][poz1][0]++;
  }
  for(b=1;b<=L;b++){
    poz2=calcul(0,b-1,1,n);
    d[0][b]=max(d[0][b-1],val(0,b-1,poz2)+timp[poz2][1]);
    copi(0,b,0,b-1,n);
    path[0][b][poz2][1]++;
  }
  for(a=1;a<=L;a++)
    for(b=1;b<=L;b++){
      poz1=calcul(a-1,b,0,n);
      poz2=calcul(a,b-1,1,n);
      if(max(d[a-1][b],val(a-1,b,poz1)+timp[poz1][0])<max(d[a][b-1],val(a,b-1,poz2)+timp[poz2][1])){
        d[a][b]=max(d[a-1][b],val(a-1,b,poz1)+timp[poz1][0]);
        copi(a,b,a-1,b,n);
        path[a][b][poz1][0]++;
      }
      else{
        d[a][b]=max(d[a][b-1],val(a,b-1,poz2)+timp[poz2][1]);
        copi(a,b,a,b-1,n);
        path[a][b][poz2][1]++;
      }
    }
  fprintf(fo, "%d\n", d[L][L]);
  for(i=0;i<n;i++)
    fprintf(fo, "%d %d\n", path[L][L][i][0], path[L][L][i][1]);
  fclose(fi);
  fclose(fo);
  return 0;
}