fork(1) download
  1. #include <stdio.h>
  2. #define INF 1000000000
  3.  
  4. int main() {
  5. int n;
  6. int s, sn; // Sパック: sn個入り, s円
  7. int m, mn; // Mパック: mn個入り, m円
  8. int l, ln; // Lパック: ln個入り, l円
  9.  
  10. scanf("%d", &n);
  11. scanf("%d %d", &sn, &s);
  12. scanf("%d %d", &mn, &m);
  13. scanf("%d %d", &ln, &l);
  14.  
  15. int min_cost = INF;
  16.  
  17. // Lパックを固定して、それより少ない必要分だけS+Mで補完
  18. // ループは1重、Lパックの購入数だけで回す
  19. for (int lc = 0; lc <= n / ln + 2; lc++) {
  20. int remaining_after_l = n - lc * ln;
  21. if (remaining_after_l < 0) remaining_after_l = 0;
  22.  
  23. // Mパックを固定して、Sパックで補完
  24. for (int mc = 0; mc <= remaining_after_l / mn + 2; mc++) {
  25. int remaining_after_m = remaining_after_l - mc * mn;
  26. if (remaining_after_m < 0) remaining_after_m = 0;
  27.  
  28. // Sパックだけで残りを補う(余りがあっても買う)
  29. int sc = (remaining_after_m + sn - 1) / sn; // 切り上げ
  30.  
  31. int total_cost = lc * l + mc * m + sc * s;
  32. int total_eggs = lc * ln + mc * mn + sc * sn;
  33.  
  34. if (total_eggs >= n && total_cost < min_cost) {
  35. min_cost = total_cost;
  36. }
  37. }
  38. }
  39.  
  40. printf("%d\n", min_cost);
  41. return 0;
  42. }
Success #stdin #stdout 0.01s 5320KB
stdin
123456
63 797
71 271
93 848
stdout
471269