嗯...

题目链接:https://www.luogu.org/problem/T2691

这道题有一点贪心的思想吧...并且思路与题目是倒着来的(貌似这种思路已经很常见的...

先举个栗子:

引出思路:按结束时间早晚排序,因为没有多早的限制,但是最晚送到的时间却有限制。把时间倒流,把时间轴倒着看,首先t初始化为max(b[i]),然后枚举一遍,如果当前t大于b[i],那在t的时候不可能到达,所以要把t改为b[i]。并且t要减去消耗时间a[i]。

初始值为最后一个送到的时间,往前推,如果前面的一个送餐时间限制比后面的时间节点(例如F)减去送餐时间(EF)晚的话,那么就把前一段送餐时间用减去,因为在两个重合(GH和EF)时间段内,在实际情况下不可能同时送两个餐,那么最紧凑的排列方法就是往前挨着叠加,那么t就变成了F(横坐标)减去EF和GH的长度,得到一个新的横坐标,再往前和前一个完成时间限制点(B)比较,看哪个更晚。

如果后面的时间节点(例如F)减去送餐时间(EF)比前面的一个送餐时间限制晚的话,就意味着最短时间限制提前到了当前的时间限制点,因为只要安排得当的话,从当前时间限制点以后的时间不会对最早时间造成任何影响!那么我们就把t提前到当前的时间限制点,继续往前推就行了。

AC代码:

 #include<cstdio>
#include<iostream>
#include<algorithm>
//时间倒流
using namespace std; const int maxn = 1e6 + ; int n;
struct node{
int a, b;
} e[maxn]; inline bool cmp(node x, node y){
return x.b > y.b;
} int main(){
scanf("%d", &n);
for(int i = ; i <= n; i++)
scanf("%d%d", &e[i].a, &e[i].b);
sort(e + , e + + n, cmp);
int t = e[].b;
for(int i = ; i <= n; i++){
if(t > e[i].b) t = e[i].b;
t -= e[i].a;
}
printf("%d\n", t);
return ;
}

AC代码

最新文章

  1. Linux配置JDK1.7和Resin4.0
  2. putty配色方案
  3. Effective Java 阅读笔记——并发
  4. [SAP ABAP开发技术总结]OPEN SQL
  5. 线程池的原理及实现 (zhuan)
  6. entity framework in mysql
  7. 如何扩展大规模Web网站的性能?
  8. Promise 让异步更优
  9. 微信小程序教程(第一篇)
  10. golang 中 string 转换 []byte 的一道笔试题
  11. Docker 堆栈
  12. 理解滑动平均(exponential moving average)
  13. H5_0008:链接分享图片和判断平台
  14. golang获取文件的md5
  15. 基础常用的数据结构 Collection Map
  16. Apache,PHP,MySQL独立安装
  17. zookeeper 节点启动时的更新机制
  18. Docker Dockerfile 基本结构详解
  19. [OpenCV] Samples 01: Geometry - 几何图形
  20. Spring容器AOP的理解

热门文章

  1. hdu 6214 Smallest Minimum Cut(最小割的最少边数)
  2. makecert 产出证书
  3. Python爬虫连载7-cookie的保存与读取、SSL讲解
  4. servlet中Request与response使用
  5. xshell 链接虚拟机
  6. C4K Power supply failed?
  7. Boxes and Candies
  8. ALSA driver基本概念
  9. maven的安装与使用(运行单元测试和打包等)
  10. css与js基础