ACM PKU 1828 Monkeys' Pride

ACM PKU 1828 Monkeys' Pride

http://acm.pku.edu.cn/JudgeOnline/problem?id=1828
看了discuss,很多同学对题意理解有误(刚开始我也理解错了)
主要是这句: If a monkey lives at the point (x0, y0), he can be the king only if there is no monkey living at such point (x, y) that x>=x0 and y>=y0

成为猴王的条件是,没有任何的一个猴子的x坐标和y坐标都大于它,而不是说猴王的x和y都要最大.
ok,算法也出来了,简单地说: 先对x快速排序,然后统计y  , 时间效率是O(n^lgn)
具体细节要自己体会,这题挺经典的.另外快速排序的方法,虽然我也不是第一次用到了,但是仍然不熟练,到网上查了语法再做的.
#include " stdio.h "
#include
" stdlib.h "

 
 typedef 
struct {
    
int x;
     
int y;
 }
node[ 50001 ];
 


 
int  cmp( const   void   * pl,  const   void   * pr) {   /**////按照x从小到大排序
    node *p1 = (node*)pl; 
     node 
*p2 = (node*)pr;
     
if(p1->== p2->x)           
         
return p1->- p2->y;
    
return p1->- p2->x;
 }

 

void  main() {
     
int num,i,total,maxy;
     
while(scanf("%d",&num) && num){
         
for(i=0;i<num;i++)
             scanf(
"%d%d",&nodes[i].x,&nodes[i].y);
         qsort(nodes, num, 
sizeof(node), &cmp); //按照x从小到大排序
       total=1;           //最后一个猴子的x最大,所以至少有一个猴王. 往前扫描,如果出现某个猴子的y大于当前最大y,total+1
         maxy=nodes[num-1].y;
        
for(i=num-2;i>=0;i--){
             
if(maxy<nodes[i].y){
                maxy
=nodes[i].y;
                 total
++;
             }

         }

         printf(
"%d\n",total);
     }

     
return;
 }



另外,在PKU上编译器效率的问题:

同样的程序,我测试了3次.
include的时候,如果用iostream,在  C++编译器下测试,Memory是476K ,时间280MS
换成 stdio.h + stdlib.h ,在C编译器下Memory是464K ,时间171MS
如果是stdio.h + stdlib.h在C++的编译器下测试呢?Memory是464K ,时间155MS

也就是说 ,同样的测试数据,要达到最好的效率,应该用纯C的方式写程序,并选择C++编译器judge程序.

你可能感兴趣的:(ACM PKU 1828 Monkeys' Pride)