[关闭]
@VecMD 2016-07-12T20:29:17.000000Z 字数 1150 阅读 1741

CF 671A

被一道这么傻逼的题卡了这么久,不说了,我去切腹自尽了。
枚举一下谁先走比较好,走哪个点比较好。显然是走后走-先走差值最大的那个点(包括负数啊,兄弟!也没谁了)。然后再对B点进行贪心的选择,同上。

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <utility>
  5. #include <iostream>
  6. #include <algorithm>
  7. const int maxn = 100007;
  8. int n;
  9. double ccc;
  10. typedef std::pair<double, double> Point;
  11. Point ali, bre, bin, point[maxn];
  12. double dist(Point const &a, Point const &b){
  13. return sqrt((a.first - b.first)*(a.first - b.first)
  14. +(a.second - b.second)*(a.second - b.second));
  15. }
  16. int go(Point p, double & ans){
  17. int id = -1;
  18. double temp = -9999999999.0 ;
  19. for(int i = 1; i <= n; i ++){
  20. double t1 = dist(p, point[i]) + dist(point[i], bin);
  21. double t2 = 2 * dist(point[i], bin);
  22. if(t2 - t1 > temp){
  23. id = i;
  24. ans = t1;
  25. temp = t2 - t1;
  26. }
  27. }
  28. ccc = std::max(ccc, temp);
  29. return id;
  30. }
  31. double cal(Point const &p, Point const &q){
  32. double res = 0.0, def = 0.0;
  33. int id = go(p, res);
  34. for(int i = 1; i <= n; i ++){
  35. if(id == i) continue;
  36. double t1, t2;
  37. t1 = 2 * dist(point[i], bin);
  38. t2 = dist(point[i], q) + dist(point[i], bin);
  39. if(def < t1 - t2) def = t1 - t2;
  40. res += t1;
  41. }
  42. return res - def;
  43. }
  44. int main()
  45. {
  46. std::cin >> ali.first >> ali.second;
  47. std::cin >> bre.first >> bre.second;
  48. std::cin >> bin.first >> bin.second;
  49. std::cin >> n;
  50. for(int i = 1; i <= n; i ++){
  51. std::cin >> point[i].first >> point[i].second;
  52. }
  53. double ans = std::min(cal(ali, bre), cal(bre, ali));
  54. printf("%.8f\n", ans);
  55. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注