fork(7) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. struct fruit{
  8. string name; //название фрукта
  9. double specific_cost; //удельная стоимость
  10. double percentage; //процентный выход сока
  11. double amount; //текущее количество на складе
  12. double worth(){ //параметр в критерии отбора
  13. return (specific_cost * 100)/percentage;
  14. }
  15. bool get(){ //логический тип позволяет
  16. return (cin >> name //производить считывание
  17. >> specific_cost //до конца файла
  18. >> percentage
  19. >> amount);
  20. }
  21. };
  22.  
  23. int main()
  24. {
  25. double V; int n; //объем сока и номер посетителя по счёту
  26. cin >> V >> n;
  27. double total_amount = 0;
  28. /*Заполнение меню - показателя текущего состояния на складе*/
  29. vector<fruit> menu;
  30. fruit tmp;
  31. while(tmp.get()){
  32. menu.push_back(tmp);
  33. total_amount += tmp.amount;
  34. }
  35. /*Критерий отбора: отсортировать в порядке уменьшения цены за литр*/
  36. sort(menu.begin(), menu.end(), [](fruit a, fruit b){return a.worth() < b.worth();});
  37. /*Составление рецепта коктейля*/
  38. /*1. Поиск фруктов, доступных на n-м шаге*/
  39. double used = (n - 1) * V; int starting_position = 0;
  40. if(total_amount >= n*V &&
  41. any_of(menu.begin(), menu.end(), [&](fruit &a) mutable {
  42. double new_amount = (used -= a.amount);
  43. if(new_amount >= 0){starting_position++; a.amount = 0;}
  44. else a.amount = (-1)*new_amount;
  45. return new_amount < 0;
  46. })){
  47. //Заполнение коктейля соком до заданного объёма
  48. double volume_left = V, price = 0; string recipe;
  49. /*Добавлять ингредиенты из отсортированного меню, пока возможно*/
  50. any_of(menu.begin() + starting_position, menu.end(), [&](fruit &a) mutable {
  51. /*Если ингридиент израсходован*/
  52. double new_amount = (volume_left -= a.amount);
  53. if(new_amount >= 0){
  54. price += a.specific_cost * a.amount;
  55. recipe += a.name + ' ' + to_string(a.amount) + '\n';
  56. a.amount = 0;
  57. }
  58. /*Если коктейль готов*/
  59. else{
  60. a.amount = new_amount + a.amount;
  61. price += a.specific_cost * a.amount;
  62. recipe += a.name + ' ' + to_string(a.amount) + '\n';
  63. }
  64. return (new_amount <= 0);
  65. });
  66. cout << recipe << price << endl;
  67. }
  68. else cout << "Sorry, we are closed for today." << endl;
  69. return 0;
  70. }
  71.  
Success #stdin #stdout 0s 3452KB
stdin
110 1
Dragonfruit 123 50 10
Aplle 10 60 200
Cherry 40 80 100
Coconut 20 5 30
Pineapple 80 90 50
Raspberry 70 95 30
Blackberry 130 95 30
Strawberry 60 95 40
Grape 20 95 120
Orange 10 80 200
Melon 10 98 300
Banana 20 30 120
stdout
Melon 110.000000
1100