Hdu 1946 Area of Mushroom[凸包]

本文详细解析了HDU在线评测系统(OJ)中的一道编程题,题目要求通过给定的学生速度和点位,判断是否存在无限占领点的可能性。文章深入分析了解题思路,并提供了官方题解的C++代码实现,帮助读者理解如何通过数学方法解决此类动态占领问题。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946

题目的意思是,给一些点,(代表学生),和这些点的速度,这些点要占领其他点(平面上所有的点,都是可以占领的),问这些点可以占领点是否是无限的。一个点被占领后,不能被其他的点占领。某一个点属于某个学生(也就是点),是走到该点所用时间小于其他所有点的时间。一开始,理解不了。以为,这些点都是动态的吧。其实,不然,其实判断某个点属于某个学生,只需要判断走到该点时间即可。。

思路:

官方题解的思路很好。

Code:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const int N = 505;
const double eps = 1e-8;
struct POINT {
    double x, y;
    double v;
    int no;
}p[N], st[N], sp[N];
int n, m, top, ans[N];

double cross(POINT o, POINT a, POINT b){
    return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
}

double Distance(POINT a, POINT b){
    return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}

bool cmp(POINT a, POINT b){
    if(a.y < b.y || (a.y == b.y && a.x < b.x)) return true;
    return false;
}
bool cmp1(POINT a, POINT b){
    double k = cross(p[0], a, b);
    if(k > eps) return true;
    else if(fabs(k) < eps && (Distance(p[0], a) - Distance(p[0], b)) < eps) return true;
    return false;
}

bool Judge(POINT a, POINT b, POINT c){
    double k = cross(a, b, c);
    if(k > eps) return true;
    else return false;
}

void Graham_scan(){
    if(n == 1) {
        if(ans[p[0].no] == -1)
        ans[p[0].no] = 1;
        return ;
    }
    sort(p, p + n, cmp);
    sort(p + 1, p + n, cmp1);
    top = 0;
    st[top ++] = p[0]; st[top ++] = p[1];
    for(int i = 2; i < n; i ++){
        while(top >= 2 && Judge(st[top - 1], st[top - 2], p[i])) top --;
        st[top ++] = p[i];
    }
    int ltop = top;
    for(int i = n - 2; i >= 0; i --){
        while(top != ltop && Judge(st[top - 1], st[top - 2], p[i])) top --;
        st[top ++] = p[i];
    }
    top --;

}//fisrt del the same point, stay one of the maxv.
int main(){
//    freopen("input.txt", "r", stdin);
    int k = 0, s;
    while(scanf("%d", &n) && n){
        s = n;
        memset(ans, -1, sizeof(ans));
        double maxv = -1;
        for(int i = 0; i < n; i ++){
            scanf("%lf %lf %lf", &p[i].x, &p[i].y, &p[i].v);
            p[i].no = i;
            maxv = max(maxv, p[i].v);
        }
        printf("Case #%d: ", ++ k);
        if(maxv == 0){
            for(int i = 0; i < n; i ++){
                printf("0");
            }
            printf("\n");
            continue;
        }
        m = 0;
        for(int i = 0; i < n; i ++){// v == maxv
            if(p[i].v != maxv) ans[p[i].no] = 0;
            else sp[m ++] = p[i];
        }
        sort(sp, sp + m, cmp);// del the same point.
        n = 0;
        p[n ++] = sp[0];
        for(int i = 1; i < m; i ++){
            if(!(sp[i].x == sp[i - 1].x && sp[i].y == sp[i - 1].y))
            p[n ++] = sp[i];
            else {
                ans[sp[i].no] = 0; ans[sp[i - 1].no] = 0;
            }
        }
        Graham_scan();
        for(int i = 0; i < top; i ++){
            if(ans[st[i].no] == -1) ans[st[i].no] = 1;
        }
        for(int i = 0; i < s; i ++){
            if(ans[i] == -1) ans[i] = 0;
        }
        for(int i = 0; i < s; i ++){
            printf("%d", ans[i]);
        }
        puts("");
    }
    return 0;
}


源码链接: https://pan.quark.cn/s/a4b39357ea24 在网页构建领域中,CSS3(层叠样式表第三版)为程序员们提供了多样化的视觉表现手法和用户交互功能。在此案例中,我们聚焦于一种普遍的用户交互设计——"CSS3鼠标指针停留在图片上时的放大效果",即当用户将鼠标光标移动至图片上时,图片会自动进行放大,从而增强了用户的参与度和视觉冲击力。此类效果经常应用于商品展示或图像预览环节,有助于提升网站的整体用户体验。 我们需要掌握HTML5中的`<img>`标签,它是用于嵌入图像的基本组件。在`<img>`标签内部,我们可以通过`src`属性来设定图像的地址,`alt`属性用于在图像无法加载时提供替代说明文字,此外还包括`width`和`height`属性用于设定图像的尺寸。 ```html <img src="image.jpg" alt="图片的说明文字" width="200" height="200"> ``` 构建图片在鼠标悬停时放大这一功能的关键在于CSS3的`:hover`伪类选择器。`:hover`用于选取鼠标光标悬停其上的元素,结合transform属性,我们可以便捷地实现图片的放大操作。以下是一个基础的示例: ```css img { transition: transform 0.3s ease; /* 引入过渡效果 */ } img:hover { transform: scale(1.2); /* 鼠标悬停时,图片放大到原尺寸的120% */ } ``` 在这段代码里,`transition`属性设置了图像在变化过程中的过渡效果,`0.3s`代表过渡持续的时间,`ease`是预设的缓动效果,使得变化过程更加流畅。`...
内容概要:本文系统研究了基于最优滑模控制的永磁同步电机(PMSM)调速系统模型,并通过Simulink平台实现了完整的仿真实验。研究聚焦于滑模控制在电机调速中的应用,重点对比了经典滑模、改进滑模与最优滑模三种控制策略的性能差异,深入分析了最优滑模控制在提升系统动态响应速度、增强抗干扰能力及改善稳态精度方面的优势。文章详细阐述了电机数学建模、控制器设计、稳定性分析与仿真验证全过程,突出了最优滑模控制在有效抑制抖振现象、提高系统鲁棒性方面的关键技术特点。; 适合人群:具备自动控制原理、电机控制理论基础及Simulink仿真技能的电气工程、自动化、控制科学与工程等相关领域的研究生、科研人员以及从事高性能电机驱动系统开发的工程技术人员。; 使用场景及目标:①为高等院校和科研机构开展先进电机控制算法的教学与科研工作提供理论依据和仿真案例;②为工业界高性能伺服系统、新能源汽车电驱动系统等领域的控制器设计提供技术参考与验证手段;③帮助研究人员深入掌握滑模控制的设计方法、参数整定技巧及其在实际工程系统中的实现路径。; 阅读建议:建议读者结合提供的Simulink模型进行同步操作与仿真,重点关注不同滑模控制器的结构设计与参数设置,通过对比仿真结果直观理解最优滑模控制的优越性。同时,可在此基础上探索将最优滑模控制与自抗扰、预测控制等先进控制理论相结合,进一步拓展其在复杂非线性系统中的应用研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值