题目链接:点击查看

题目大意:在数轴上有 n 个房子,每个房子开放的时间为 [ l[ i ] , r[ i ] ] ,在这个房子里铸一把剑需要 t[ i ] 个连续的时间单位,同一个时间只能在一间房子里铸剑,问最多能铸多少剑

题目分析:对于一个时间戳 t 而言,只有两种情况,我们可以讨论一下:

  1. 如果 t 时刻没有房子开放,那么我们选择接下来首先可以铸完剑的房子显然是最优的,注意是首个可以铸完剑的房子,而不是首个可以铸剑的房子,换句话说也就是 l[ i ] + t[ i ] 最小的区间肯定是最优的,而不是 l[ i ] 最小的区间
  2. 如果 t 时刻有房子开放,那么我们显然在 t[ i ] 最小的房子里铸剑是最优的

基于此,这个题目就变成了一个贪心的问题,考虑如何贪心

因为数轴给的区间非常大,但是却非常的稀疏,所以我们并不需要枚举时间戳 t ,而是枚举每个区间的开始点和结束点就可以计算出相应的贡献

具体如何计算呢,因为上面的讨论中也提到了,按照 l[ i ] + t[ i ] 升序排序对于情况 1 来说一定是最优的,对于情况 2 最优的话,我们需要维护一个数据结构,满足在一堆数字中快速查找到其最小值,还必须要快速的插入和删除,因为对于每个端点来说都是需要更新的,所以不难想到用 set 来维护,这样每次插入删除都是 log 级别的,查询更是 O( 1 ) 级别的,又因为时间 t[ i ] 是可以重复出现的,所以我们选择用 multiset 进行维护铸剑时间 t[ i ] 的最小值

剩下的实现就好了, 维护一个 pre 指针代表上一次的结束位置,每次让 pre 贪心在数轴上跳,顺便维护一下贡献就好了,有点小细节可以看代码

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;struct Node
{LL pos,t;bool flag;//开始点:0,结束点:1Node(LL pos,LL t,bool flag):pos(pos),t(t),flag(flag){}bool operator<(const Node& t)const{if(pos!=t.pos)return pos<t.pos;return flag<t.flag;}
};vector<Node>node;multiset<LL>st;int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n;scanf("%d",&n);for(int i=1;i<=n;i++){LL l,r,t;scanf("%lld%lld%lld",&l,&r,&t);node.push_back(Node(l+t,t,0));node.push_back(Node(r,t,1));}sort(node.begin(),node.end());//按照l[i]+t[i]升序排序,满足情况1LL ans=0,pre=0;for(Node t:node){if(!st.empty())//如果当前有房子开放{LL num=(t.pos-pre)/(*st.begin());//贪心计算贡献ans+=num;pre+=num*(*st.begin());}if(t.flag)//结束点 st.erase(st.find(t.t));else//开始点 {if(pre+t.t<=t.pos)//到达开始点l[i]+t[i]时就可以铸一把剑了{ans++;pre=t.pos;}st.insert(t.t);}}printf("%lld\n",ans);return 0;
}

CodeForces - 1267A Apprentice Learning Trajectory(贪心)相关推荐

  1. codeforces Gym 100338E Numbers (贪心,实现)

    题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...

  2. Codeforces 671E Organizing a Race (贪心、线段树)

    题目链接 https://codeforces.com/contest/671/problem/E 题解 完全不会做--基本是抄lk的代码 ruogu的题解: https://www.luogu.co ...

  3. CodeForces - 1529E Trees of Tranquillity(贪心+线段树)

    题目链接:https://vjudge.net/problem/CodeForces-1529E 题目大意:给出两棵根节点为 111 的树,分别称为 AAA 树和 BBB 树,现在通过两棵树可以构造出 ...

  4. [CodeForces 1603C] Extreme Extension(贪心 + 数论分块优化dp)

    problem CodeForces solution observation1:\text{observation1}:observation1: 对于一个非空子段 [l,r][l,r][l,r], ...

  5. codeforces 416C C. Booking System(贪心)

    题目链接: codeforces 416C 题目大意: 给出n个请求,每个请求包括客人数量和支付金额,再给出m个桌子,包括桌子大小,问如何安排才能最大盈利.给出最大盈利和一个能够最大盈利的方案. 题目 ...

  6. Codeforces 540B School Marks 【贪心构造】

    题目链接:Codeforces 540B School Marks Little Vova studies programming in an elite school. Vova and his c ...

  7. CodeForces 508E Arthur and Brackets 贪心

    题目: E. Arthur and Brackets time limit per test 2 seconds memory limit per test 128 megabytes input s ...

  8. Codeforces 797C Minimal string【贪心】

    题意: 给出了字符串s的内容,字符串t,u初始默认为空,允许做两种操作: 1.把s字符串第一个字符转移到t字符串最后. 2.把t字符串最后一个字符转移到u字符串最后. 最后要求s.t字符串都为空,问u ...

  9. codeforces 719C (复杂模拟-四舍五入-贪心)

    题目链接:http://codeforces.com/problemset/problem/719/C 题目大意: 留坑... 转载于:https://www.cnblogs.com/A--Q/p/5 ...

最新文章

  1. input不管用 vue_Vue自定义指令实现快速读取Excel
  2. “数学不好,干啥都不行!”骨灰级程序员:其实你们都是瞎努力!
  3. 推荐些在线小制作小工具
  4. python发邮件给女朋友代码_python实现邮件发送完整代码(带附件发送方式)
  5. java中select的用法_mybaties中select用法,以及常用增删改查
  6. Action重定向总结
  7. html元素两种分类。替换元素和不可替换元素;块级元素和行内元素
  8. io读两个文件,生成list 排重后写本地文件(Java)
  9. bzoj 1861 treap
  10. access数据库代做_矿井三维模型(代做矿山模型)
  11. pc模仿移动端滚动条样式,好看就对了
  12. java判断一个数是不是素数_Java-判断一个数是不是素数
  13. 用 Python j进行一次短视频音频创作
  14. linux公社_如何在Linux上搭建个人流媒体服务器
  15. Python每日一练——第5天:闰年问题升级版
  16. Selenium 定位Loading元素图标,只需要简单配置下就行
  17. Parallels Desktop | 在 Mac 里装 Windows 的最佳工具。
  18. AD中对PCB的滴泪和敷铜操作
  19. 笔记本突然无线和有线都不能使用
  20. 笔记本电脑无论插、拔耳机后都没有声音,解决方法

热门文章

  1. c语言5个学生3门成绩写入文件,(5) 输入N个学生的姓名和3门课的成绩,统计每个学生的平均成绩后,将结果输出到文件studen...
  2. java finereport_java报表FineReport_JS整理
  3. 分布式事务六种解决方案
  4. Spring集成web环境步骤
  5. AOP 的作用及其优势
  6. flume案例-网络数据采集-Flume安装
  7. 微服务发现组件Eureka:简介以及Eureka服务端开发
  8. SpringMVC拦截器之拦截器接口方法演示
  9. SpringBoot 配置环境属性
  10. 元素的选中问题 元素选中的问题 切换复选框选中 全选和全不选