【ybtoj】贪心算法例题
【基础算法】第二章 贪心算法
例一 奶牛晒衣服
题目描述
有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;
}
例四 荷马史诗
题目背景
追逐影子的人,自己就是影子 —— 荷马
题目描述
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】贪心算法例题的更多相关文章
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
- 剑指Offer——贪心算法
剑指Offer--贪心算法 一.基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.虽然贪心算法不能对 ...
- 算法导论----贪心算法,删除k个数,使剩下的数字最小
先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=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 ...
- ACM_ICPC hdu-2111(简单贪心算法)
一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...
- 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...
- 增强学习贪心算法与Softmax算法
(一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...
- 【九度OJ】题目1434贪心算法
题目 本题的贪心算法策略需要深入思考一下 看到题目,最初没有理解题目的要求:看尽量多的完整的节目.尽量多是指数量多,自己理解成观看的时间最长.这样想其实简化了这道题. 正确理解题意后,首先想到的想法是 ...
- 题目1437:To Fill or Not to Fill:贪心算法解决加油站选择问题(未解决)
//贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include& ...
随机推荐
- Java 中如何实现线程间通信
世界以痛吻我,要我报之以歌 -- 泰戈尔<飞鸟集> 虽然通常每个子线程只需要完成自己的任务,但是有时我们希望多个线程一起工作来完成一个任务,这就涉及到线程间通信. 关于线程间通信本文涉及到 ...
- Redis之持久化方式详解
背景:Redis之所以能够在技术革新发展迅速的时代超越Memcache等其他Nosql数据库,最主要的一点是Redis提供数据持久化,能够根据持久化策略将缓存数据灵活的写到磁盘上,更好地满足了当下海量 ...
- 【Java常用类】BigDecimal
BigDecimal 一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中, 要求数字精度比较高,故用到java.math.BigDecimal类. BigDecimal类支 ...
- postman设置token等关联参数
登陆时登录成功后服务器会返回一个token,这个token作为第二步骤的入参:第二个步骤请求成功后服务器会返回一个新token,然后这个token作为第三步骤的入参!如此一来的话,要用postman做 ...
- (转)Make 命令
Make 命令 代码变成可执行文件,叫做编译(compile):先编译这个,还是先编译那个(即编译的安排),叫做构建(build). Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目 ...
- visual studio进行机器学习与python编写
visual studio里的python安装之后自带一个虚拟环境 1.anaconda有些包版本无法到最新. 2.包管理器在安装卸载,强制停止后,包管理器会出问题,一直卸不掉那个包. 在卸载pyth ...
- unity3d之public变量引发错误
public变量引发错误 在vs ide中怎么更改也无效 后来发现public里面的值一直不改变,手动改之.
- 从零开始, 开发一个 Web Office 套件 (1): 富文本编辑器
这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 富文本编辑器 万里长征 ...
- threejs - src - WebGLProgram是如何组建Shader的?
threejs - src - WebGLProgram是如何组建Shader的? WebGLProgram的构建 WebGLProgram构建的时候需要的参数如下: // \param render ...
- linux远程搭建yum网络仓库《全面解析》
目录 一:远程版本需求 1.yum简介 2.yum安装解析 二:yum安装的生命周期 三:yum私有仓库作用与必要性 四:搭建yum私有仓库 本地版本 1.下载必须的软件包 2.创建软件仓库(就是创建 ...