Cod sursa(job #2102428)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 8 ianuarie 2018 20:19:09
Problema Rubarba Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <bits/stdc++.h>

const int MAX_N = 200000;
struct PROB {
  int n, t, id;
}v[MAX_N], v2[MAX_N];

bool cmp1(PROB a, PROB b) {
  return a.n < b.n;
}

bool cmp2(PROB a, PROB b) {
  return a.t < b.t;
}

bool check(int n, int x, int t) {
  int i = n - 1, top;
  top = 0;
  while(i >= 0 && v[i].n >= x) {
    v2[top++] = v[i];
    --i;
  }
  std::sort(v2, v2 + top, cmp2);
  if(top < x)
    return 0;
  for(int i = 0; i < x; ++i)
    t -= v2[i].t;
  return t >= 0;
}

int main() {
  int n, t;
  int st, dr;
  scanf("%d%d", &n, &t);
  for(int i= 0 ; i < n; ++i) {
    scanf("%d%d", &v[i].n, &v[i].t);
    v[i].id = i + 1;
  }

  std::sort(v, v + n, cmp1);
  st = 0;
  dr = n + 1;
  while(dr - st > 1) {
    int mid = (st + dr) / 2;
    if(check(n, mid, t))
      st = mid;
    else
      dr = mid;
  }
  check(n, st, t);
  printf("%d\n%d\n", st, st);
  for(int i = 0; i < st; ++i)
    printf("%d ", v2[i].id);

  return 0;
}