Cod sursa(job #2506632)

Utilizator mateicosCostescu Matei mateicos Data 8 decembrie 2019 16:18:13
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>

using namespace std;

int n, m;
int a[105][105];

struct P{
  int x, y;
}v[105], sl[105][105];

int verif(int med){
    int i, j, k, d;
    for(i = 0;i <= n;i++)
        for(j = 0;j <= m;j++)
          a[i][j]= -20000000;
    a[0][0]=0;
    for(i = 1;i <= n;i++){
        for(j = 0;j <= m;j++){
            for(k = j;k >= 0;k--){
                d = (j - k) * v[i].y;
                if(d > med)
                  k = -1;
                else
                if(a[i][j] < a[i-1][k] + (med - d) / v[i].x){
                  a[i][j] = a[i-1][k] + (med-d) / v[i].x;
                  sl[i][j].x = (med - d) / v[i].x;
                  sl[i][j].y = j - k;
                }

            }
        }
    }
    if(a[n][m] >= m)
      return 1;
    return 0;
}

void afis(int n, int m){
    if(n != 1)
      afis(n - 1, m - sl[n][m].y);
    printf("%d %d\n", sl[n][m].x, sl[n][m].y);
}

int main(){
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);
    int i, st, dr, med;
    scanf("%d%d", &n, &m);
    for(int i=1;i<=n;++i){
        scanf("%d%d", &v[i].x, &v[i].y);
    }
    st = 1;
    dr = 100 * 200;
    while(st <= dr){
        med = (st+dr)/2;
        if(verif(med))
          dr = med - 1;
        else
          st = med + 1;
    }
    verif(st);
    printf("%d\n", st);
    afis(n, m);
    return 0;
}