【基础算法】第二章 贪心算法

例一 奶牛晒衣服

题目描述

有n件衣服,第i件衣服的湿度为h。

在自然条件下,每件衣服每分钟都可以自然晒干A点湿度。

在烘干机作用下,可以选择一件衣服,用一分钟的时间晒干B点湿度。

求出晒干所有衣服的最少时间(湿度为0为干)。

输入格式

第一行三个正整数N,A,B。

接下来N行,第i行一个正整数,表示第i件衣服的湿度

h。

输出格式

输出一个数,表示晒干所有衣服的最少时间。

样例输入

 3 2 1
1
2
3

样例输出

1

分析

在不考虑烘干机的情况下,最后一件烘干的衣服一定是湿度最大的衣服,所以我们希望湿度最大的衣服的湿度越小越好。

所以得到:让湿度最大的衣服使用烘干机。

Code:

#include <bits/stdc++.h>
using namespace std;
priority_queue<int> pq;
int n,A,B;
int t;
int main()
{
cin>>n>>A>>B;
for (int i=1;i<=n;i++) {
int x;
cin>>x;
pq.push(x);
}
while(1){
++t;
int x=pq.top();
pq.pop();
x-=B;
pq.push(x);
if (pq.top()-t*A<=0) {
cout<<t<<endl;
return 0;
}
}
}

例二 雷达装置

题目描述

有n个建筑物,第i个建筑物在笛卡尔坐标系上的坐标为(x,y),你需要在x轴上安装一些雷达,每个雷达的侦察半径均为d,要求每个建筑物都至少被一个雷达侦测到,求最少要安装几个雷达。

输入格式

第一行两个正整数n,d。

接下来n行,第i行两个整数x,y。

输出格式

输出一行表示答案,若没有解决方案,则答案为-1。

样例输入

  3 2
1 2
-3 1
2 1

样例输出

2

分析



如图,将所有建筑物转化成雷达建造区间

1.将所有区间按右端点从小到大排序。

2.依次考虑每一个区间:

·若当前区间内包含最后一个选择的点,则直接跳过。

·若当前区间内不包含最后一个选择的点,则在该区间的右端点放一个新点。

Code:

#include <bits/stdc++.h>
using namespace std;
int n,d,x,y,s=1;
double tail;
struct node
{
double l,r;
}a[1005];
bool cmp(node x,node y)
{
return x.r<y.r;
}
int main()
{
cin>>n>>d;
for(int i=1;i<=n;i++)
{
cin>>x>>y;
if(d<y){
printf("-1");
return 0;
}
a[i].l=x-sqrt(d*d-y*y);
a[i].r=x+sqrt(d*d-y*y);
}
sort(a+1,a+n+1,cmp);
tail=a[1].r;
for(int i=2;i<=n;i++)
if(a[i].l>tail){
s++;
tail=a[i].r;
}
cout<<s;
return 0;
}

例三 畜栏预定

题目描述

有N头牛在畜栏中吃草。每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏,给出第i头牛开始吃草的时间区间[A,B],求需要的最少畜栏数和每头牛对应的畜栏方案。

输入格式

第一行一个正整数N。

接下来N行,第i行两个正整数A,B。

输出格式

第一行一个整数,表示需要的最少畜栏数。

接下来N行,第i行一个整数表示第i头牛的对应畜栏,编号是从1开始的连续整数,方案合法即可。

样例输入

  5
1 10
2 4
3 6
5 8
4 7

样例输出

4

1

2

3

2

4

分析

1.将牛按开始吃草的时间排序。

2.维护每个畜栏安排进去的最后的一头牛,依次考虑每一头牛,找到满足“当前的牛开始吃草的时间不早于畜栏中最后的一头牛结束吃草的时间”的任意的一个畜栏,将其安排进去,若没有这样的畜栏,则为其新建一个畜栏。

Code

#include <bits/stdc++.h>
using namespace std;
int n;
int a[100000][3];
int ans[100000];
struct node{
int x, y;
}s[100000];
bool cmp(node x,node y){
return x.x<y.x;
}
int main(){
cin>>n;
int m=0;
for(int i=1; i<=n; i++)
cin>>s[i].x>>s[i].y;
sort(s+1, s+n+1, cmp);
for(int i=1; i<=n; i++){
int x, y, flag=0;
x=s[i].x, y=s[i].y;
for(int j=1; j<=m; j++){
if(a[j][2]<x){
flag=1;
a[j][1]=x;
a[j][2]=y;
ans[i]=j;
break;
}
}
if(flag==0){
m++;
a[m][1]=x;
a[m][2]=y;
ans[i]=m;
}
}
cout<<m<<endl;
for(int i=1; i<=n; i++)
cout<<ans[i]<<endl;
}

例四 荷马史诗

洛谷P2168

题目背景

追逐影子的人,自己就是影子 —— 荷马

题目描述

Allison 最近迷上了文学。她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。但是由《奥德赛》和《伊利亚特》 组成的鸿篇巨制《荷马史诗》实在是太长了,Allison 想通过一种编码方式使得它变得短一些。

一部《荷马史诗》中有 n 种不同的单词,从 1 到 n 进行编号。其中第 i 种单词出现的总次数为 wi。Allison 想要用 k 进制串 si​ 来替换第 i 种单词,使得其满足如下要求:

对于任意的 1≤i,j≤n,i!=j,都有:si不是 sj的前缀。

现在 Allison 想要知道,如何选择 si,才能使替换以后得到的新的《荷马史诗》长度最小。在确保总长度最小的情况下,Allison 还想知道最长的 si 的最短长度是多少?

一个字符串被称为 k 进制字符串,当且仅当它的每个字符是 0 到 k−1之间(包括 0 和 k−1 )的整数。

字符串 str1 被称为字符串 str2 的前缀,当且仅当:存在 1≤t≤m ,使得 str1=str2[1..t]。其中,m 是字符串 str2 的长度,str2[1..t] 表示 str2 的前 t 个字符组成的字符串。

输入格式

输入的第 1 行包含 2 个正整数 n,k,中间用单个空格隔开,表示共有 n 种单词,需要使用 k 进制字符串进行替换。

接下来 n 行,第 i+1 行包含 1 个非负整数 wi,表示第 i 种单词的出现次数。

输出格式

输出包括 2 行。

第 1 行输出 1 个整数,为《荷马史诗》经过重新编码以后的最短长度。

第 2 行输出 1 个整数,为保证最短总长度的情况下,最长字符串 si 的最短长度。

样例输入 1

  4 2
1
1
2
2

样例输出 1

12

2

样例输入 2

  6 3
1
1
3
3
9
9

样例输出 2

36

3

分析

【ybtoj】贪心算法例题的更多相关文章

  1. 贪心算法(Greedy Algorithm)

    参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...

  2. 剑指Offer——贪心算法

    剑指Offer--贪心算法 一.基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.虽然贪心算法不能对 ...

  3. 算法导论----贪心算法,删除k个数,使剩下的数字最小

    先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...

  4. LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  5. ACM_ICPC hdu-2111(简单贪心算法)

    一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...

  6. 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题

    1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...

  7. 增强学习贪心算法与Softmax算法

    (一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...

  8. 【九度OJ】题目1434贪心算法

    题目 本题的贪心算法策略需要深入思考一下 看到题目,最初没有理解题目的要求:看尽量多的完整的节目.尽量多是指数量多,自己理解成观看的时间最长.这样想其实简化了这道题. 正确理解题意后,首先想到的想法是 ...

  9. 题目1437:To Fill or Not to Fill:贪心算法解决加油站选择问题(未解决)

    //贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include& ...

随机推荐

  1. Echart可视化学习(五)

    文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 常见的数据可视化库: D3.js ...

  2. Java实现抽奖模块的相关分享

    Java实现抽奖模块的相关分享 最近进行的项目中,有个抽奖的需求,今天就把相关代码给大家分享一下. 一.DAO层 /** * 获取奖品列表 * @param systemVersion 手机系统版本( ...

  3. webstorm 配置git代码项目管理工具

    1.下载最新的webStrom11安装包安装 https://confluence.jetbrains.com/display/WI/Previous+WebStorm+Releases/ 2.破解w ...

  4. Linux下Makefile的编写及四个特殊符号的意义@、$@、$^、$

    转自:https://blog.csdn.net/runfarther/article/details/50036115# 我们先看三段C++程序: 一.line1的源码 line1.h #ifnde ...

  5. golang中使用zap日志库

    1. 快速使用 package main import ( "go.uber.org/zap" "time" ) func main() { // 1. sug ...

  6. Servlet-整个Servlet类的继承体系

  7. Asp-Net-Core开发笔记:接口返回json对象出现套娃递归问题

    前言 看了下推送记录,一个月前,OK,我又变成月更了o(╯□╰)o,这绝对不行![○・`Д´・ ○] 所以今天来更新了 其实不是我懒得更新或者是太忙,其实是最近在写一篇很长的博客,一直没写完( Ĭ ^ ...

  8. python代码加注释--6

    备注:#用来注释代码,#后面的内容会被python解释器忽略

  9. 学习Java第4天

    今天所作的工作: 1.类 2.类的构造方法 3.静态变量 4.类的主方法 5.对象 今天没有完成昨天的工作安排,因为发现进入类之后的编程思想发生的变化,相对与c++的逻辑既有较大的相似性又有不同的性质 ...

  10. ApacheCN Golang 译文集 20211025 更新

    Go 云原生编程 零.前言 一.现代微服务架构 二.使用 RESTAPI 构建微服务 三.保护微服务 四.使用消息队列的异步微服务架构 五.使用 React 构建前端 六.在容器中部署应用 七.AWS ...