码迷,mamicode.com
首页 > 其他好文 > 详细

[2016-04-16][URAL][2067][Friends and Berries]

时间:2016-04-16 21:36:13      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

  • 时间:2016-04-16 20:06:06 星期六

  • 题目编号:[2016-04-16][URAL][2067][Friends and Berries]

  • 题目大意:给定n个点的坐标,问 d(u,v)?d(u,v)+d(v,w),d(w,v)2?w, 的点有多少对

  • 分析:

    • 上面等式化简之和可以得到 类似 a?b+c, 有多少种情况 .
    • 又已知三角形中 b+c>a,所以满足上式的三点一定共线
    • 扩展到题目的n个点,那么必须满足两个条件:
      • 三点共线
      • 两个点在最外面
      • 并且,这样的点至多一对
    • 所以题目就变成了求n个点是否共线,共线就把最外面的两个点的编号输出
      • 使用两个向量平行,差积为0这一点来变成
  • 遇到的问题:

    • 重载 < 运算的时候,打错字母 x == a.y ,然后就呵呵~
    • 如果使用向量成比例来计算,要注意讨论分母为0的情况,即有一个坐标为0
  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int maxn = 2 * 1E5 + 10;
  5. struct Point {
  6. int x,y,id;
  7. Point(int a = 0 , int b = 0):x(a),y(b){};
  8. bool operator < (const Point & a)const{
  9. return x < a.x || (x == a.x && y < a.y);
  10. }
  11. Point operator - (const Point & a)const{
  12. return Point(x - a.x,y-a.y);
  13. }
  14. int operator ^ (const Point & a)const{
  15. return x*a.y - y*a.x;
  16. }
  17. }p[maxn];
  18. int main(){
  19. int n;
  20. scanf("%d",&n);
  21. for(int i = 0 ; i < n ; ++i){
  22. scanf("%d%d",&p[i].x, &p[i].y);
  23. p[i].id = i + 1;
  24. }
  25. int flg = 1;
  26. sort(p,p+n);
  27. Point tmp = p[1] - p[0];
  28. for(int i = 2 ; i < n ; ++i){
  29. if((p[i] - p[0])^tmp){
  30. flg = 0;break;
  31. }
  32. }
  33. if(flg) printf("1\n%d %d\n",p[0].id, p[n - 1].id);
  34. else printf("0\n");
  35. return 0;
  36. }




[2016-04-16][URAL][2067][Friends and Berries]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/a58630172a5c62c2ce02dfa8c93d784a.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!