记录编号 397839 评测结果 AAAAAAAAAAAAAA
题目名称 猴子和香蕉 最终得分 100
用户昵称 Gravatarconfoo 是否通过 通过
代码语言 C++ 运行时间 1.442 s
提交时间 2017-04-20 22:15:45 内存使用 15.55 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <queue>
  5. #include <vector>
  6. #define fa (o>>1)
  7. const int C = 25, N = 2e6 + 1, INF = 2e9;
  8. int n, m, k, x[C], y[C], st[N], sz, pos[C], dep[N];
  9. inline int extend(int i) {
  10. if (pos[i] + 1 > sz) return INF;
  11. // long long r = (long long)st[pos[i] + 1]*x[i];
  12. for (;pos[i] + 1 <= sz && st[pos[i] + 1]%(x[i] - 1); pos[i]++);
  13. return pos[i] + 1 <= sz ? st[pos[i] + 1]/(x[i] - 1)*x[i] + y[i] : INF;
  14. }
  15. int main() {
  16. freopen("monkeys.in", "r", stdin);
  17. freopen("monkeys.out", "w", stdout);
  18. scanf("%d%d", &n, &m);
  19. for (int i= 1; i <= m; i++) scanf("%d%d", x + i, y + i);
  20. st[++sz] = 0;
  21. scanf("%d", &k);
  22. k++;
  23. for (; sz < k;) {
  24. int mn = 2e9, mp;
  25. for (int i = 1; i <= m; i++) {
  26. int x;
  27. if ((x = extend(i)) < mn) {
  28. mp = i;
  29. mn = x;
  30. }
  31. }
  32. if (mn == 2e9) break;
  33. else {
  34. if (st[sz] == mn) dep[sz] = std::min(dep[sz], dep[pos[mp] + 1] + 1);
  35. else if (dep[pos[mp] + 1] + 1 <= n) st[++sz] = mn, dep[sz] = dep[pos[mp] + 1] + 1;
  36. pos[mp]++;
  37. }
  38. }
  39. printf("%d\n", sz == k ? st[sz]: -1);
  40. }