贪心专题技巧

制定参赛顺序

贪心策略:
如果己方最低的也比我方最高的高,就让我方最低的去,否则在能获胜的情况下选取我方分数大于其第一个去。

小技巧:可以利用二叉搜索树(mutiset)在保存我方的,因为在保存的时候,会默认由低到高排序,

代码:

int order(const vector<int>&russion,const vector<int>&korean){
    int n = russion.size(),wins = 0;
    multiset<int>ratings(korean.begin(),korean.end());
    for(int rus = 0;rus<n;++rus){
        if(*ratings.rbegin()<russion[rus])
        ratings.erase(ratings.begin());
        else{
            ratings.erase(ratings.lower_bound(russion[rus]));
            ++wins;
        }
    }
    return wins;
}

调度问题

加热便当

等到快中午的时候元硕才发现,营地里只有1台可供加热的微波炉。更糟糕的是,这台微波炉功率太小,每次只能加热1个便当。假设,加热第i个便当需要耗费mi秒,吃这个便当将耗费ei秒的时间。
求最小的吃午饭时间

贪心策略

无论以何种方式最后的时间总是,所以的便当加热时间加上其中一个吃便当的时间,这是因为最后加热的便当只能最后被吃掉,即使之前有一个吃的时间很长,那么就是加这个之前的。
因为我们以 吃便当的时间进行降序排列。遍历一篇即可。

代码:

int e[N],m[N];
int heat(){
    //决定加热顺序
    vector<pair<int,int>>order;
    for(int i=0;i<n;++i)
    order.push_back(make_pair(-e[i],i)); // 负数,那么大的序号就会自动杂前边
    sort(order.begin(),order.end());
    //模拟整个过程
    int ret = 0,beginEat = 0;
    for(int i=0;i<n;++i){
        int box = order[i].second; //得到序号
        beginEat += m[box];
        ret = max(ret,beginEat+e[box]);
    }
}

米那斯雅诺

题意:
米那斯雅诺城从来没有被攻陷过的,这里有一个半径为8公里的巨大的圆形城墙——拉马斯安澈。围绕整个城市的巨大城墙中设有n个哨所,各哨所的监视范围为以哨所为中心、半径为r:的圆。不过,因城墙结构限制,各个哨所的设立点并不规则,而且能够监视的范围也各不相同。
图中,租实线表示城墙,五星表示哨所,虚线则表示哨所的监视范围。为了以最少兵力监视整个城墙,仅想在一部分哨所上安排哨兵。给出各个哨所的位置和监视范围时,设计一个程序计算监视整个城墙所需的最少兵力。
为了简便起见,假设城墙是厚度为0的圆形,而哨所是一个点。

先通过转换,将问题转换为圆心角区间的问题,要监视所以的圆形部分,就要判断出监视领域的并集能否完全覆盖[0,2pi)

const double pi = 2.0 * acos(0);
int n;
double y[100],x[100],r[100];
pair<double,double>ranges[100];

void convertToRange(){
    for(int i =0;i<n;++i){
        double loc = fmod(2*pi + atan2(y[i],x[i]),2*pi);
        double range = 2.0 * asin(r[i]/2.0/8.0);
        ranges[i] = make_pair(loc - range,loc + range);
    }
    //默认会以起始位置最小的区间开始排序
    sort(ranges,ranges);
}

fmod()函数:
头文件:#include< cmath >
fmod()用来对浮点数进行取模(求余)。设x=k*n+h,则返回值为h(h和x的符号相同)。

贪心求解

const int INF = 987654321;
int n;
pair<double,double>ranges[100];
// 选择覆盖0点的区间后,剩余的展成线段

int solveCircular(){
    int ret =INF;
    //按起始位置升序排列各区间
    sort(ranges,ranges+n);
    //选择覆盖0点的区间后
    for(int i=0;i<n;++i)
        if(ranges[i].first<=0||ranges[i].second>=2*pi){
            // 排除被此区间覆盖的部分后,剩余的圆心角区间
            double begin = fmod(ranges[i].second,2*pi);
            double end = fmod(ranges[i].first+2*pi,2*pi);
            ret = min(ret,1+solveLinear(begin,end))
        }
}

int solveLinear(double begin,double end){
    int used = 0,idx = 0;
    //只要有未覆盖的线段就一直执行
    while(begin<end){
        //在begin 之前的起始区间中求出离右端点最近的区间
        double maxCover = -1;
        while(idx < n&& ranges[idx].first <= begin){
            maxCover = max(maxCover,ranges[idx].second);
            ++idx;
        }
        //未找到能够覆盖的区间时
        if(maxCover <= begin)return INF;
        //去掉已被覆盖的线段
        begin = maxCover;
        ++ used;
    }
    return used;
}
在机器人操作系统(ROS)中,机器视觉是机器人感知和理解周围环境的关键技术。robot_vision功能包专注于这一领域,集成了多种视觉处理技术,包括摄像头标定、OpenCV库应用、人脸识别、物体跟踪、二维码识别和物体识别,极大地拓展了ROS在视觉应用方面的能力。 摄像头标定:作为机器视觉的基础,摄像头标定用于消除镜头畸变并获取相机的内参和外参。在ROS中,camera_calibration包提供了友好的用户界面和算法,帮助计算相机参数矩阵,为后续的图像校正和三维重建提供支持。 OpenCV:OpenCV是一个广泛使用的开源计算机视觉库,在ROS中扮演着重要角色。robot_vision功能包可能包含OpenCV的示例代码和节点,涵盖图像处理、特征检测、模板匹配和图像分割等功能,这些功能对机器人视觉系统至关重要。 人脸识别:ROS中的人脸识别结合了图像处理和机器学习技术。robot_vision可能集成了基于OpenCV的人脸检测算法,如Haar级联分类器或Adaboost方法,甚至可能包含深度学习模型(如FaceNet或SSD),帮助机器人实现人脸的识别和跟踪,提升人机交互能力。 物体跟踪:物体跟踪使机器人能够持续关注并追踪特定目标。在ROS中,通常通过卡尔曼滤波器、粒子滤波器或光流法实现。robot_vision功能包可能包含这些算法的实现,助力机器人完成动态目标跟踪任务。 二维码识别:二维码是一种高效的信息编码方式,常用于机器人定位和导航。ROS中的二维码包可用于读取和解析二维码,而robot_vision可能进一步封装了这一功能,使其更易于集成到机器人系统中。 物体识别:作为机器视觉的高级应用,物体识别通常涉及深度学习模型,如YOLO、SSD或Faster R-CNN。robot_vision功能包可能包含预训练的模型和对应的ROS节点,使机器人能够识别环境中的特
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值