Coffee Break
题目大意:有一位员工想要利用喝咖啡来休息,他给了一个数组表示他想要喝咖啡的时间点(假设他喝咖啡用时1分钟),老板规定每次喝咖啡的时间间隔必须要大于d。问:他将给定数组的时间点都经
历一遍最少(贪心所在)需要多长时间,并输出每个时间点是在第几天经历的;
解题思路:贪心地选取喝咖啡的时间,我们尽量选取喝咖啡时间靠前的,然后贪心寻找能放在他后面最靠前的时间点,如果放不开就新开一天。
用map和队列的做法:
/* */
# include <iostream>
# include <stdio.h>
# include <string.h>
# include <string>
# include <iomanip>
# include <algorithm>
# include <ctime>
# include <cmath>
# include <climits>
# include <cstdlib>
# include <utility>
# include <bitset>
# include <cctype>
# include <cassert>
# include <set>
# include <map>
# include <deque>
# include <queue>
# include <stack>
# include <vector>
# include <functional>
using namespace std; typedef long long ll;
const int maxn=2e5+;
const ll mod=1e9+;
const int eps=1e-;
const double pi=acos(-1.0);
# define mem(a,x) memset((a),(x),sizeof((a)))
# define gcd(a,b) (__gcd(a, b))
# define lcm(a,b) (a*b/__gcd(a, b))
# define lson l,m,rt<<
# define rson m+,r,rt<<|
# define lowbit(x)(x&(-x)) int origin[maxn], after[maxn];
map<int, int>m;///存某时间喝咖啡是在哪一天
//priority_queue<int, vector<int>, greater<int> > q;
queue<int>q;
int main()
{
int n, mm, d, cnt=;
cin>>n>>mm>>d; for(int i=; i<=n; i++ )
{
scanf("%d", &origin[i]);
after[i] = origin[i];
} sort(after+, after++n);
m[after[]] = ;//时间点最靠前的在第一天
q.push();
for(int i=; i<=n; i++ )
{
int top=q.front();
if( after[i]-after[top]>d )//可以在同一天
{
m[after[i]]=m[after[top]];
q.pop();
} else
{
cnt++;
m[after[i]] = cnt;
} q.push(i);
}
cout<<cnt<<endl;
for(int i=; i<=n; i++ )
{
if( i== )
printf("%d", m[origin[i]]); else
printf(" %d", m[origin[i]]);
}
cout<<endl;
return ;
}
set的做法:
/* */
# include <iostream>
# include <stdio.h>
# include <string.h>
# include <string>
# include <iomanip>
# include <algorithm>
# include <ctime>
# include <cmath>
# include <climits>
# include <cstdlib>
# include <utility>
# include <bitset>
# include <cctype>
# include <cassert>
# include <set>
# include <map>
# include <deque>
# include <queue>
# include <stack>
# include <vector>
# include <functional>
using namespace std; typedef long long ll;
const int maxn=2e5+;
const ll mod=1e9+;
const int eps=1e-;
const double pi=acos(-1.0);
# define mem(a,x) memset((a),(x),sizeof((a)))
# define gcd(a,b) (__gcd(a, b))
# define lcm(a,b) (a*b/__gcd(a, b))
# define lson l,m,rt<<
# define rson m+,r,rt<<|
# define lowbit(x)(x&(-x)) int a[maxn];
set<int>s;
map<int,int>mp;//喝咖啡的时间点在第几天
int n, m, d;
int main()
{
int i;
cin>>n>>m>>d;
s.clear();//清空set
for( i=; i<=n; i++ )
{
cin>>a[i];
s.insert(a[i]);//插入时间点
} set<int>::iterator iter;//迭代器指针iter
int cnt=;
int ans=; while( s.size() )//当set容器中的元素个数不为0
{
iter = s.lower_bound(cnt);//在set中查找第一个大于等于cnt的数的所在位置,如果不在返回s.end()
if( iter==s.end())
{
ans++;
cnt=;
} else
{
mp[*iter] = ans;
s.erase(*iter);//删除set中值为*iter的数
cnt = *iter+d+;
}
}
cout<<ans<<endl;
for(int i=; i<=n; i++ )
{
if( i== )
printf("%d", mp[a[i]]);
else
printf(" %d", mp[a[i]]);
}
cout<<endl;
return ;
}
Coffee Break的更多相关文章
- CF1041C Coffee Break
CF1041C Coffee Break 题目大意: 给定nn个数和一个kk,这nn个数都不超过mm 每次从没被去掉的数里面选一个数aa,去掉aa,然后可以任意一个b(b>a+k)b(b> ...
- C. Coffee Break 贪心 思维 有点难 有意思
C. Coffee Break 这个贪心之前好像写过,还是感觉挺难的,有点不会写. 这个题目大意是:给你一个数列n个元素,然后给你一天的时间,给你一个间隔时间d, 问你最少要用多少天可以把这个数列的所 ...
- Gym - 101911A "Coffee Break"
传送门 题意: Monocarp得到一份工作,每天要工作 m 分钟,他有一个爱好,喜欢在休息的时候喝咖啡,但是他的老板不乐意了,就给他规定了个 时间 d,在 d 分钟内只能喝一杯咖啡. 现给出Mono ...
- 【CodeForces-1041C】Coffee Break(二分解决关于set,pair,upper_bound用法)
//题意:一个的工作时间是m分钟. // 在特定的时间和咖啡 n a1,a2....an,, ai代表的是每个咖啡要在一天中对应的时间点喝掉 // 每一次喝咖啡的时间为1分钟 // 必须在一天中的ai ...
- A. Coffee Break(思维题,类似于邻接表的head数组用法)
题:https://codeforces.com/gym/101911/problem/A 题意:每天工作m分钟,每次喝coffee得间隔d分钟,然后给出n个数,每个数表示想在一天中的a[i]的时刻喝 ...
- 2018.09.16 codeforces1041C. Coffee Break(双端队列)
传送门 真心sb题啊. 考场上最开始看成了一道写过的原题... 仔细想了一会发现看错了. 其实就是一个sb队列. 每次插入到队首去就行了. 代码: #include<bits/stdc++.h& ...
- 视觉中的深度学习方法CVPR 2012 Tutorial Deep Learning Methods for Vision
Deep Learning Methods for Vision CVPR 2012 Tutorial 9:00am-5:30pm, Sunday June 17th, Ballroom D (Fu ...
- javascript设计模式-工厂模式
简单工厂模式:使用一个类来生成实例. 复杂工厂模式:使用子类来决定一个成员变量应该是哪个具体的类的实例. 简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口.通过工 ...
- Ubuntu 13.04/12.10安装Oracle 11gR2图文教程(转)
Ubuntu 13.04/12.10安装Oracle 11gR2图文教程 原文标题:How to Install Oracle 11G R2 Enterprise Edition Database U ...
随机推荐
- Kafka启用SASL_PLAINTEXT动态配置JAAS文件的几种方式
Kafka是广泛使用消息服务,很多情况下关于认证部分我都是默认的配置,也就是不需要用户名/密码,也不配置证书.在内网或者在项目组内部可以,但是设计的跨部门时一般处于安全考虑都需要加上认证,防止kafk ...
- 环境变量-path
配置的是bin二进制可执行程序,用于系统查找程序的位置
- C# vb .net实现透视图效果滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的透视图效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一 ...
- K8S 中的容器编排和应用编排
众所周知,Kubernetes 是一个容器编排平台,它有非常丰富的原始的 API 来支持容器编排,但是对于用户来说更加关心的是一个应用的编排,包含多容器和服务的组合,管理它们之间的依赖关系,以及如何管 ...
- MVC运行机制[转]
原:http://www.cnblogs.com/jyan/archive/2012/06/29/2569566.html#3122335 ASP.NET是一种建立动态Web应用程序的技术.它是.NE ...
- Tomcat组件梳理—Digester的使用
Tomcat组件梳理-Digester的使用 再吐槽一下,本来以为可以不用再开一个篇章来梳理Digester了,但是发现在研究Service的创建时,还是对Digester的很多接口或者机制不熟悉,简 ...
- Python的字符串函数
今天用了将近一天的时间去学习Python字符串函数 上午学了17个,下午学了23个(共计40) 详细内容请见菜鸟教程--Python3字符串--Python的字符串内建函数
- Appscan漏洞之已解密的登录请求
本次针对 Appscan漏洞 已解密的登录请求 进行总结,如下: 1.1.攻击原理 未加密的敏感信息(如登录凭证,用户名.密码.电子邮件地址.社会安全号等)发送到服务器时,任何以明文传给服务器的信息都 ...
- 机器学习 | 聚类分析总结 & 实战解析
聚类分析是没有给定划分类别的情况下,根据样本相似度进行样本分组的一种方法,是一种非监督的学习算法.聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或相似度划分为若干组,划分的原则是组内距离最小化 ...
- day 03 预科
目录 什么是变量: 变量的组成 变量的风格 1.驼峰体 2.下划线 变量名的组成规范 注释的作用 turtle库的简单使用 什么是变量: 1.是变化的量. 2.变:现实世界中的状态是会发生改变的. 3 ...