zoukankan      html  css  js  c++  java
  • 7033: Lounge Lizards(lis)

    7033: Lounge Lizards

    时间限制: 10 Sec  内存限制: 128 MB
    提交: 60  解决: 13
    [提交] [状态] [讨论版] [命题人:admin]

    题目描述

    Monitor lizards are a kind of reptile known mainly for their cold-bloodedness and addiction to computer screens. Due to their love for digital displays, these scaly creatures spend most of their time at home glued to a small television in the lounge.
    Conflict has arisen at one particular reptile house. The audience here has grown so large that not everyone will be able to see the screen at once any more; specifically, a lizard will only be able to see enough if it is strictly taller than all of the lizards sitting exactly along the straight line from itself to the television.
    Monitor lizards aren’t particularly picky about the actual contents of the screen or being able to see it obliquely (or even from the front)—they just want to be able to keep an eye on it.
    The lizards don’t want to move, however. It’s possible to chase a monitor lizard away in order for the ones behind it to see, or leave it alone, but re-homing somewhere else in the room is unthinkable.
    Assuming lizards are removed optimally, how many at most can remain and still see the screen?
     

    输入

    • one line containing the space-separated integers TX and TY (−106 ≤ TX, TY ≤ 106), the co-ordinates of the television.
    • one line containing the integer N (1 ≤ N ≤ 106), the number of lizards.
    • N further lines, each containing three space-separated integers XiYiHi (−106 ≤ X, Y ≤106; 1 ≤ H ≤ 106), the co-ordinates and height respectively of one lizard.
    The co-ordinates of all televisions and lizards will be distinct.

    输出

    Output the maximum number of lizards that can stay and watch television at once.

    样例输入

    50 50
    2
    60 50 1
    65 50 2
    

    样例输出

    2
    

    来源/分类

    UKIEPC2017 

    将每个点按先 角度递增,后 与中心的距离增加 规则排序,取每个角度上的最长上升子序列求和。

    代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+10;
    const int inf=0x3f3f3f3f;
    const double eps=1e-8;
    struct node{
        int x,y,h;
        double angle,dis;
        bool operator<(const node &p) const {return (fabs(angle-p.angle)<eps)?(dis<p.dis):(angle<p.angle);}
    }a[maxn];
    int dp[maxn];
    vector<int>v[maxn];
    int lis(int i){
        int len=v[i].size();
        for (int j=0; j<len; j++) dp[j]=inf;
        for (int j=0; j<len; j++) *lower_bound(dp,dp+len,v[i][j])=v[i][j];
        return lower_bound(dp,dp+len,inf)-dp;
    }
    int x,y,n;
    int main(){
        scanf("%d%d",&x,&y);
        scanf("%d",&n);
        for (int i=1; i<=n; i++){
            scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].h);
            a[i].x-=x,a[i].y-=y;
            a[i].angle=atan2(a[i].y,a[i].x);
            a[i].dis=sqrt(1.0*a[i].y*a[i].y+1.0*a[i].x*a[i].x);
        }
        sort(a+1,a+1+n);
        int tot=0;
        v[++tot].push_back(a[1].h);
        for (int i=2; i<=n; i++){
            if(fabs(a[i].angle-a[i-1].angle)>eps) ++tot;
            v[tot].push_back(a[i].h);
        }
        int ans=0;
        for (int i=1; i<=tot; i++) ans+=lis(i);
        printf("%d
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    接Oracle11g_client精简版安装步骤(2019年11月18日)之Plsql配置
    Oracle11g_client精简版安装步骤(2019年11月18日)
    PC端微信版本过低问题
    Windows下Nginx无法启动且进程里没有?
    Eclipse中复制项目后,怎么更改项目名等相关配置?(2019年10月17日)
    tomcat改端口号
    java基础
    数据库
    数组相关
    Linux系统实战
  • 原文地址:https://www.cnblogs.com/acerkoo/p/9550609.html
Copyright © 2011-2022 走看看