排序 POJ 1828

题目:

题目链接

给出N个二维点,要求所有不受控制点的个数,对于 <x0,y0> <script type="math/tex" id="MathJax-Element-1"> </script> , 如果存在点 <x,y> <script type="math/tex" id="MathJax-Element-2"> </script> 使得 x>=x0 && y>=y0 ,这就称为 <x0,y0> <script type="math/tex" id="MathJax-Element-5"> </script>受控于 <x,y> <script type="math/tex" id="MathJax-Element-6"> </script>。

  • N<5* 104 ;
  • multi_case

解法:

这个题目还算不错,,只允许 Nlog(N) 的排序预处理和N的遍历。,,求解的时候,最开始想到的是二分,,结果超时。。看样子case还是挺强的~~

  • 先将所有点按照 x_y进行排序。就是先按 x 递增, x相同的再按 y 递增。
  • 去除所有 x 坐标相同的点,只剩下其中 y 值最大的那个点。
  • 然后从右往左遍历,最右边的点肯定不受控,ans++,maxy等于最右边的点的 y 坐标。考虑第i 个点,如果它的 y <script type="math/tex" id="MathJax-Element-325">y</script> 大于maxy ,则ans++,并更新maxy,否则继续往前考虑。(自己在稿纸上随便画几个点就很清楚了~~~)

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

struct Node{
  int x;
  int y;
}nodes[5*10000+5];

bool cmp_x_y(const Node &n1, const Node &n2){
     if(n1.x<n2.x) return true;
     else if(n1.x == n2.x && n1.y<n2.y) return true;
     return false;
}

int main()
{
    int N;
    while(1)
    {
        scanf("%d",&N);
        if(!N) break;
        for(int i = 0; i<N; i++){
              scanf("%d%d",&nodes[i].x,&nodes[i].y);
        }
        sort(nodes,nodes+N,cmp_x_y);
        int k = 0;
        for(int i=0; i<N; i++)
        {
            if(i<N-1 && nodes[i].x == nodes[i+1].x)
                 continue;
            else nodes[k++] = nodes[i];
        }
        int ans = 1;
        int maxy = nodes[k-1].y;
        for(int i = k-2; i>=0; i--){
            if(nodes[i].y>maxy){
                ans++;
                maxy = nodes[i].y;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值