「AGC023D」 Go Home

传送门

神题。

首先我们可以倒着考虑。

当车到达最后一栋楼的时候,车上一定只有到这栋楼的员工。

当车到达倒数第二栋楼的时候,车上一定只有到达剩下两栋楼的员工。

设这两栋楼分别为 \(a,b\),且 \(x_a<x_b\)。如果当前公交车不在 \(a,b\) 之间,那么直接往一个方向移动肯定是最优秀的。否则,若 \(p_a>p_b\),则一定会先往 \(a\) 的方向移动。

当车到达倒数第三栋楼的时候,车上一定只有到达剩下三栋楼的员工。

设这三栋楼分别为 \(a,b,c\),且 \(x_a<x_b<x_c\)。如果当前公交车不在 \(a,c\) 之间,那么直接往一个方向移动肯定是最优秀的。

否则会有一类很特殊的情况:有汽车在 \(a,b\) 之间,且 \(p_a>p_c,p_a<p_b+p_c\)。这个时候如果 \(c\) 把票投给向自己家的方向,反而会使自己到家的时间变晚——汽车会先向 \(c\) 方向走,再到达 \(a\) 楼,最后到达 \(c\) 楼。

所以 \(c\) 一定会把票投给向 \(a\) 方向走。

我们发现这等价于把 \(c\) 楼的人全部看作 \(a\) 楼的人,然后再加上公交车到 \(a\) 楼的路程,使公交车移动到 \(a\) 楼。

然后你会发现我们上面分析的过程可以通过递归来实现,然后这个题就做完了。

/*---Author:HenryHuang---*/
/*---Never Settle---*/
/*---Never Enough---*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll x[maxn],p[maxn];
ll n,s;
ll calc(ll l,ll r,ll t){
if(s<x[l]) return x[r]-s;
if(x[r]<s) return s-x[l];
if(p[l]>=p[r]){
p[l]+=p[r];
return calc(l,r-1,l)+(t==r?x[r]-x[l]:0);
}
else{
p[r]+=p[l];
return calc(l+1,r,r)+(t==l?x[r]-x[l]:0);
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>s;
for(int i=1;i<=n;++i){
cin>>x[i]>>p[i];
}
cout<<calc(1,n,p[1]>=p[n]?n:1)<<'\n';
return 0;
}

「AGC023D」 Go Home的更多相关文章

  1. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  2. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  3. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  4. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  5. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  6. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  7. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  8. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

  9. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

随机推荐

  1. JS 反射机制及 Reflect 详解

    一.什么是反射机制 反射机制是在编译阶段不知道是哪个类被加载,而是在运行的时候才加载.执行. 也就是说,反射机制指的是程序在运行时能够获取自身的信息. js 中的 apply 就是反射机制. 二.Re ...

  2. python 获取当天和前几天时间数据

    python 获取当天和前几天时间数据 import datetime from datetime import datetime, date, timedelta def dayDateRange( ...

  3. node.js学习(2)函数

    1 简答函数 2 匿名函数 3 回调函数

  4. Tengine Framework基础

    Tengine Framework基础 最受开发者喜爱的边缘AI计算框架 Tengine是OPEN AI LAB推出的自主知识产权的边缘AI计算框架,致力于解决AIoT产业链碎片化问题,加速AI产业化 ...

  5. PyTorch 自动微分示例

    PyTorch 自动微分示例 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后训练第一个神经网络.autograd 软件包为 Tensors 上的所有算子提供自动微分 ...

  6. TensorFlow Keras API用法

    TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...

  7. 自然语言推理:微调BERT

    自然语言推理:微调BERT Natural Language Inference: Fine-Tuning BERT SNLI数据集上的自然语言推理任务设计了一个基于注意力的体系结构.现在通过微调BE ...

  8. Nginx虚拟主机流量状态模块(nginx-module-vts)使用说明文档(四)

    装完NG,为了拿到各种状态指标,就要对NG做监控. Github 2.3k的开源项目nginx-module-vts没准真是你需求的. 链接数,qps,1xx.2xx,.3xx.4xx.5xx的响应数 ...

  9. Vue3中toRefs的使用

    1 使用reactive 实现数据的响应式 <template> <div> <h2>toRef的使用</h2> <p> 姓名:{{stat ...

  10. 从一条sql报错解决过程学习程序员查bug的思路

    从oracle迁移数据到达梦后,发现数据库默认值都丢失了.于是我想从oracle数据库将默认值查出来,在达梦数据库加回去. 于是上网查了一下,看怎么获取oracle数据库字段默认值信息,找到了这个sq ...