SB贪心......暴露了我代码能力巨弱的本质。

题面

解:首先我们应该想到DP(但是我想到了贪心......)

然后分析题目本质,每个点有个限制,最早开走时间不得早于最晚上车时间。

然后我们就可以把每个人看做都在那个时间上车。

然后我们发现,对一个地方使用加速,会影响它后面一段区间。

然后就有个暴力·雏形是枚举在某个点用加速,看它能够减少的时间,取最大的那个用。

然后看一眼数据范围,大概是n²,可以过,只要你每次找到收益最大的点是O(n)即可。

然后发现好难写,细节巨多无比......一直觉得这个算法是错的,因为只有一个想法,根本无法转成代码实现。

然后肝了好久,受不了了,去看题解,发现我TM想的是正解,只是不会实现......

代码实现:

固定数组:limit,up,down,sum,分别表示最晚上车时间,上车人数,下车人数,down的前缀和。

变化数组:dis,to,to_lar,now,influ,分别表示所用时间(D),最远能影响到的位置,这条影响链上最多能承受减去的时间,抵达这里的时间,这里修改会影响的人数。

大部分可变数组都倒序求出,now是正序求出。

然后试一下某hack数据:

4 5 1
3 0 2

0 1 2
0 1 4
0 1 4
0 1 4
0 1 4       ans = 18

 1 #define wwx AK_IOI
 2
 3 #include <cstdio>
 4 #include <algorithm>
 5
 6 const int N = 1010, INF = 0x7f7f7f7f, M = 10010;
 7
 8 struct Custom {
 9     int t, A, B;
10 }a[M];
11
12 int n, m, k, dis[N], limit[N], to[N], now[N], up[N], down[N], sum[N], influ[N], to_lar[N];
13
14 int main() {
15     scanf("%d%d%d", &n, &m, &k);
16     for(int i = 1; i < n; i++) {
17         scanf("%d", &dis[i]);
18     }
19     for(int i = 1; i <= m; i++) {
20         scanf("%d%d%d", &a[i].t, &a[i].A, &a[i].B);
21         limit[a[i].A] = std::max(limit[a[i].A], a[i].t);
22         up[a[i].A]++;
23         down[a[i].B]++;
24     }
25     sum[1] = down[1];
26     for(int i = 2; i <= n; i++) {
27         limit[i] = std::max(limit[i], limit[i - 1]);
28         sum[i] = sum[i - 1] + down[i];
29     }
30     // get limit sum up down
31
32     while(k) {
33         now[1] = 0;
34         for(int i = 2; i <= n; i++) {
35             now[i] = std::max(now[i - 1], limit[i - 1]) + dis[i - 1];
36         }
37         int large = -1, pos = -1;
38         to[n] = n - 1;
39         to_lar[n] = INF;
40         for(int i = n - 1; i >= 1; i--) {
41             if(now[i + 1] > limit[i + 1]) {
42                 to[i] = to[i + 1];
43                 to_lar[i] = std::min(to_lar[i + 1], now[i + 1] - limit[i + 1]);
44                 //to_lar[i] = std::min(to_lar[i], dis[i]);  <- ERROR
45             }
46             else {
47                 to[i] = i;
48                 to_lar[i] = INF;
49             }
50             influ[i] = sum[to[i] + 1] - sum[i];
51             //printf("influ : %d  %d  \n", i, influ[i]);
52             if(influ[i] > large && to_lar[i] && dis[i]) {
53                 large = influ[i];
54                 pos = i;
55             }
56         }
57         if(to_lar[pos] == 0) {
58             break;
59         }
60         to_lar[pos] = std::min(to_lar[pos], dis[pos]);
61         dis[pos] -= std::min(to_lar[pos], k);
62         k -= std::min(to_lar[pos], k);
63         //printf("pos = %d  to[] = %d  lar = %d \n", pos, to[pos], to_lar[pos]);
64     }
65
66     now[1] = 0;
67     for(int i = 2; i <= n; i++) {
68         now[i] = std::max(now[i - 1], limit[i - 1]) + dis[i - 1];
69     }
70
71     int ans = 0;
72     for(int i = 1; i <= m; i++) {
73         ans += now[a[i].B] - a[i].t;
74     }
75
76     printf("%d", ans);
77     return 0;
78 }

AC代码

转载于:https://www.cnblogs.com/huyufeifei/p/9803519.html

洛谷P1315 观光公交相关推荐

  1. [luogu]P1315 观光公交[贪心]

    [luogu]P1315 [NOIP2011]观光公交 --!x^n+y^n=z^n 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车, ...

  2. 【洛古 P1315】 [NOIP2011 提高组] 观光公交

    [NOIP2011 提高组] 观光公交 题目背景 感谢 @Transhumanist 提供的一组 Hack 数据 题目描述 风景迷人的小城 Y 市,拥有 n n n 个美丽的景点.由于慕名而来的游客越 ...

  3. 洛谷P5661 公交换乘(CSP-J 2019 T2)

    传送门 题目可能排版有问题,导致出现一些乱码,具体请参考洛谷原题 题目描述 著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案: 在搭乘一次地铁后可以获得一张优惠 ...

  4. 【做题记录】[NOIP2011 提高组] 观光公交

    P1315 [NOIP2011 提高组] 观光公交 我们想在 \(k\) 次加速每一次都取当前最优的方案加速. 考虑怎样计算对于每一条边如果在当前情况下使用加速器能够使答案减少的大小. 如果当前到达某 ...

  5. 广度优先搜索——好奇怪的游戏(洛谷 P1747)

    题目选自洛谷P1747 简单的广搜模板题,4+8 = 12个方向进行bfs,目的地是(1,1) 每次查看队首是否到达,若到达(1,1) 则返回队首步长即可~ 需要注意的是,马走日和像走田的位置计算 i ...

  6. 洛谷or牛客数据结构+算法

    栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...

  7. 洛谷 P8312 [COCI2021-2022#4] Autobus

    PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P8312 [COCI2021-2022#4] Autobus 题目 题目描述 在一个国家里有 nnn 座城市.这些城市由 mmm 条 ...

  8. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  9. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

最新文章

  1. Oracle EBS渗透测试工具
  2. python中的迭代器,生成器,闭包,装饰器,@property
  3. char* 赋值 const char* 释放_Effective C++读书笔记之条款3:尽可能使用const
  4. 信息科学 计算机 区别,电子信息科学技术和计算机科学技术有什么区别啊
  5. 计算机理论python字符串作业_[Python基础 ] Day_07_作业参考答案
  6. 色彩专题——蓝色(blue)_8号招牌档
  7. 二叉树遍历非递归写法
  8. 【数据结构排序算法(五)】二路归并排序
  9. 智慧校园导航软件,实现3D校园室内外定位导航!
  10. gdt描述_GDT形位公差详解.ppt
  11. PC版免费京东全民营业自动化做任务脚本(多号版)
  12. 北风的年终总结2021
  13. 初级的数据分析师,主要需要做哪些工作?
  14. Blue Coat 拓展安全行业最大的加密流量管理协作组织
  15. window XP驱动开发(一)如何下载WDK
  16. 令人迷惑的scp路径
  17. Excel文件显示“文件已损坏,无法打开”情况的解决办法
  18. 微信小程序商城源码独立版/公众号/H5/DIY装修/营销/直播/拼团/秒杀/前端vue全开源代码
  19. SQL多对多关系通过关联中间表查询
  20. 深入浅出地理解STM32中的中断系统——从原理到简单工程示例——保姆级教程

热门文章

  1. Java - HtmlEmail 邮件发送
  2. oracle ocr组成员替换,Oracle RAC 迁移替换 OCR 盘
  3. 虚拟机无法访问主机mysql_解决虚拟机linux端mysql数据库无法远程访问
  4. 信号与系统 2022 春季学期第一次作业-作业题目准备
  5. 提高电路板EMC能力PCB设计和布线方法
  6. 2021年春季学期-信号与系统-第十次作业参考答案-第六小题
  7. 2021年春季学期-信号与系统-第一次作业参考答案-第五题
  8. 2021年春季学期-信号与系统-第一次作业参考答案-第二题
  9. 2020人工神经网络第一次作业-解答第一部分
  10. 第十六届全国大学生智能汽车竞赛设想