POJ 1828

POJ 1828

 1  #include < iostream >
 2  #include < algorithm >
 3  using   namespace  std;
 4  // ======================================================
 5  struct  Point
 6  {
 7       int  x; int  y;
 8       int  flag;
 9  };
10  struct  Point p[ 50050 ];
11  int  n;
12  // ======================================================
13  // 原来自己用了两方面即想x相同时比y,y相同时比x,两个排序,两个比较,超时。没有下面方法好,只用了一半。。。要好好加油了~TVT.
14  // 按照x从小到大排序,当x相等时按照y从大到小排序,从左到右,见到最高的就加一,counter初始值为1
15  // 即x最大时,y中也是最大值的p[n-1].y一定是,然后就像爬楼梯一样比较
16  int  cmp1(  const   void   * a ,  const   void   * b )
17  {
18       struct  Point  * =  (Point  * )a;
19       struct  Point  * =  (Point  * )b;
20       if (c -> !=  d -> x)  return  c -> -  d -> x;
21       else   return  c -> -  d -> y;
22  }
23 
24 
25  // ==============================================================
26  int  main()
27  {
28 
29       while (scanf( " %d " , & n) != EOF && n)
30      {
31           int  counter = 1 ;
32          memset(p, 0 , sizeof (p));
33           for ( int  i = 0 ;i < n; ++ i)
34          {
35              cin >> p[i].x >> p[i].y;
36          }
37          qsort(p,n, sizeof (p[ 0 ]),cmp1); // 按照x从小到大排序,当x相等时按照y从大到小排序
38           // 从左到右,见到最高的就加一
39           int  max = p[n - 1 ].y;
40           for ( int  i = n - 2 ;i >= 0 ; -- i)
41          {
42               if (p[i].y > max)
43              {
44                  counter ++ ;
45                  max = p[i].y;
46              }
47          }
48          printf( " %d\n " ,counter);
49      }
50      
51  }

你可能感兴趣的:(POJ 1828)