贪心—Ⅰ

  • 防晒

原题链接

我们首先将奶牛可以承受的最小值,递减排序,也就是降序排列,然后将防晒霜固定的值,递减排序,还是降序排列.

对于每头奶牛,扫描一遍所有防晒霜,在这头奶牛能用的防晒霜里找SPF最大的使用

注意:降序排序,保证对于每一头牛而言,它用的是,可以使用的最差的防晒霜,因为值越小的防晒霜,有可能让更多的牛使用.而升序排列,就恰好反了.

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

using namespace std;

const int N=3500;
int n,m;

struct node
{
    int spf,cover;
}a[N];

struct node2
{
    int min_spf,max_spf;
}b[N];

bool cmp1(node2 a,node2 b)
{
        return a.min_spf>b.min_spf;
}

bool cmp2(node a,node b)
{
        return a.spf>b.spf;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
        scanf("%d%d",&b[i].min_spf,&b[i].max_spf);
    sort(b,b+n,cmp1);
    for(int i=0;i<m;i++)
        scanf("%d%d",&a[i].spf,&a[i].cover);
    sort(a,a+m,cmp2);
    
    int ans=0;
    for(int i=0;i<n;i++)//枚举奶牛
    {
        for(int j=0;j<m;j++)//枚举防晒霜
        {
            if(a[j].spf>=b[i].min_spf&&a[j].spf<=b[i].max_spf&&a[j].cover)
            {
                ans++;
                a[j].cover--;
                break;//枚举下一头奶牛
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}
  • 畜栏预定

原题链接

贪心+小根堆

维护一个小根堆,记录当前每个畜栏安排进去的最后一头牛
依次对于每头牛,与小根堆堆顶比较,若不小于畜栏最后一头牛结束吃草的时间,则加入,如果这样的畜栏不存在,则为其新建一个畜栏

时间复杂度为:O(NlogN)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>

using namespace std;

typedef pair<int,int>PII;

const int N=50010;

int n;

int id[N];//牛对应其牛栏号
pair<PII,int>cow[N];



int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        cow[i]={{l,r},i};//第i号牛的进与出
    }
    
    sort(cow,cow+n);//按照左端点排序,一个一个加
    
    priority_queue<PII,vector<PII>,greater<PII> >heap;
    int num=1;
    
    heap.push({cow[0].first.second,num});//0号牛最晚结束时间,即其牛栏号
    
    id[cow[0].second]=1;//0号牛对应栅栏1号
    
    //往里面放牛
    for(int i=1;i<n;i++)
    {
         int l=cow[i].first.first,r=cow[i].first.second,cowid=cow[i].second;
         
         if(l>heap.top().first)//若这只牛能放进这里面
         {
             int t=heap.top().second;//记录一下牛栏号
             heap.pop();//此牛栏更新最晚结束时间
             heap.push({r,t});
             id[cowid]=t;
         }
         else//新建牛栏
         {
             heap.push({r,++num});
             id[cowid]=num;
         }
    }
    cout<<heap.size()<<endl;
    for(int i=0;i<n;i++)
        cout<<id[i]<<endl;
    
    return 0;
}

  • 雷达设备

原题链接

由勾股定理可知,将所有小岛转化成区间后,问题转化为:给定 n 个区间,在 x 轴上选择尽量少的点,使得所有区间至少包含一个点。

算法步骤:

将所有区间按右端点从小到大排序;

依次考虑每个区间:如果当前区间包含最后一个选择的点,则直接跳过;如果当前区间不包含最后一个选择的点,则在当前区间的右端点的位置选一个新的点;

时间复杂度:

计算每个坐标所对应的区间,需要 O(n) 的计算量;
将所有区间排序需要 O(nlogn) 的计算量;
扫描所有区间需要 O(n) 的计算量;
所以总共的时间复杂度是 O(nlogn)。

#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;

const int N=1005;

typedef pair<double,double>PDD;

double INF=0x3f3f3f3f;
int n,r;

PDD seg[N];

int main()
{
    cin>>n>>r;
    
    bool success=true;
    
    for(int i=0;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        if(y>r)
        {
            success=false;
            break;
        }
        auto len=sqrt(r*r-y*y);
        seg[i]={x+len,x-len};
    }
    if(!success)
    {
        printf("-1\n");
    }
    else
    {
        sort(seg,seg+n);//按照尾边排序
        int res=0;//统计雷达数
        double last=-INF;
        for(int i=0;i<n;i++)
        {
            if(seg[i].second>last)
            {
                res++;
                last=seg[i].first;
            }
        }
        cout<<res;
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 简述 贪心算法是指,在每次作出决策时,只考虑采取当前意义下的最优策略。因此,运用贪心算法时要求整体的最优可以由局部...
    BlowMan阅读 952评论 0 0
  • 区间贪心 POJ 2376: Cleaning Shifts选择尽量少的区间覆盖一段线段。将所有区间按照左端点升序...
    云中翻月阅读 465评论 0 1
  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 9,231评论 3 52
  • 贪心算法是指,在对问题求解中,对问题的每一步决策都采取当前意义下最优策略的算法,即问题的整体最优性可以由局部最优性...
    _NewMoon阅读 658评论 1 3
  • 本文主要作为自己的学习笔记,并不具备过多的指导意义。 概述 贪心算法通常用来求解最优问题 由局部最优解到整体最优解...
    kirito_song阅读 1,589评论 0 10