p11968.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include <algorithm>
  2. #include <array>
  3. #include <iostream>
  4. #include <map>
  5. #include <utility>
  6. #include <vector>
  7. #include <iomanip>
  8. #include <sstream>
  9. #include <climits>
  10. #include <queue>
  11. #include <list>
  12. #include <cmath>
  13. using namespace std;
  14. typedef long long int nat;
  15. int main()
  16. {
  17. nat num_tests, num_items, num_cakes, num_drinks;
  18. cin >> num_tests;
  19. for(nat test = 0; test < num_tests; ++test)
  20. {
  21. cin >> num_items >> num_cakes >> num_drinks;
  22. nat sum_prices = 0;
  23. vector<nat> cake_price(num_cakes);
  24. vector<nat> drink_price(num_drinks);
  25. for(nat i = 0; i < num_items; ++i)
  26. {
  27. nat price;
  28. cin >> price;
  29. sum_prices += price;
  30. if(i < num_cakes)
  31. {
  32. cake_price[i] = price;
  33. }
  34. else if(i < num_cakes+num_drinks)
  35. {
  36. drink_price[i-num_cakes] = price;
  37. }
  38. }
  39. // for(auto i : cake_price)
  40. // {
  41. // cout << "Cake price: " << i << endl;
  42. // }
  43. //
  44. // for(auto i : drink_price)
  45. // {
  46. // cout << "Drink price: " << i << endl;
  47. // }
  48. const unsigned int FIXED_PRECISION = 3;
  49. double avg = (double)sum_prices / num_items;
  50. long long int avg_fixed_point = round(avg*(1<<FIXED_PRECISION));
  51. // cout << "Average: " << avg << endl;
  52. // cout << "Average fixed: " << (avg_fixed_point) << endl;
  53. pair<nat, nat> cake(0,LLONG_MAX), drink(0,LLONG_MAX);
  54. for(nat i = 0; i < num_cakes+num_drinks; ++i)
  55. {
  56. if(i < num_cakes)
  57. {
  58. //cout << abs((cake_price[i]<<FIXED_PRECISION)-avg_fixed_point) << " < " << abs(cake.second-avg_fixed_point) << " && " << (cake_price[i]<<FIXED_PRECISION) << " < " << cake.second << endl;
  59. if(abs((cake_price[i]<<FIXED_PRECISION)-avg_fixed_point) < abs(cake.second-avg_fixed_point))
  60. {
  61. // Found closer cake!
  62. cake.first = i;
  63. cake.second = (cake_price[i]<<FIXED_PRECISION);
  64. }
  65. else if(abs((cake_price[i]<<FIXED_PRECISION)-avg_fixed_point) == abs(cake.second-avg_fixed_point) && (cake_price[i]<<FIXED_PRECISION) < cake.second)
  66. {
  67. // Found cheaper cake!
  68. cake.first = i;
  69. cake.second = (cake_price[i]<<FIXED_PRECISION);
  70. }
  71. }
  72. else
  73. {
  74. //cout << "i: " << i << endl << abs((drink_price[i-num_cakes]<<FIXED_PRECISION)-avg_fixed_point) << " < " << abs(drink.second-avg_fixed_point) << " && " << (drink_price[i-num_cakes]<<FIXED_PRECISION) << " < " << drink.second << endl;
  75. if(abs((drink_price[i-num_cakes]<<FIXED_PRECISION)-avg_fixed_point) < abs(drink.second-avg_fixed_point))
  76. {
  77. // Found closer drink!
  78. drink.first = i-num_cakes;
  79. drink.second = (drink_price[i-num_cakes]<<FIXED_PRECISION);
  80. }
  81. else if(abs((drink_price[i-num_cakes]<<FIXED_PRECISION)-avg_fixed_point) == abs(drink.second-avg_fixed_point) && (drink_price[i-num_cakes]<<FIXED_PRECISION) < drink.second)
  82. {
  83. // Found cheaper drink!
  84. drink.first = i-num_cakes;
  85. drink.second = (drink_price[i-num_cakes]<<FIXED_PRECISION);
  86. }
  87. }
  88. }
  89. cout << "Case #" << test+1 << ": " << (cake.second>>FIXED_PRECISION) << " " << (drink.second>>FIXED_PRECISION) << endl;
  90. }
  91. return 0;
  92. }