传送门

题意简述:大家在数轴上生活,公司在 s。

班车送所有人回家,有 n 个住处,第 i 个位置在 xi,居住了 pi 的人。

保证 xi 互不相同。

大家⼀起投票向前还是向后,如果票数相同就固定向数轴负方向,每个⼈是自私的,希望自己尽早回家。

(但是注意,虽然是自私的,并不⼀定投自己家的方向)

到家了必须下车(因为自私)

问大家都做最优决策的情况下,最后⼀个回家的人需要多久到家?

车速为 1。

this is an easy problem.

事实上,这题我们应该倒着思考,对于最后的两队人:最左边的和最右边的,如果最左边的不比最右边的少,那么无论如何投票,最后都会先走到最左边,再走到最右边。这样的话相当于最右边的人并没有选择权,因此他们应该将票投给左边来使左边的人都尽快回家然后使自己尽快回家。这样的话最右边的人的位置已经不重要了,我们可以直接将最右边的人与最左边的人合并,然后继续判断合并之后最左边的人和最右边的人的关系,直到所有人都位于起点的一侧直接全部接完就行了。

代码如下:

#include<bits/stdc++.h>
#define N 1000005
#define ll long long
using namespace std;
inline ll read(){
    ll ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
ll n,s,ans,x[N],p[N];
int main(){
    n=read(),s=read();
    for(ll i=1;i<=n;++i)x[i]=read(),p[i]=read();
    ll l=1,r=n;
    while(l<=r){
        if(x[l]>=s){ans+=x[r]-s;break;}
        if(x[r]<=s){ans+=s-x[l];break;}
        ans+=x[r]-x[l];
        if(p[l]>=p[r])while(p[l]>=p[r]&&l<r)p[l]+=p[r--];
        else while(p[l]<p[r]&&l<r)p[r]+=p[l++];
    }
    printf("%lld",ans);
    return 0;
}

最新文章

  1. JS魔法堂:不完全国际化&amp;本地化手册 之 实战篇
  2. c#.net 生成清晰缩略图
  3. MySQL出现Access denied for user &#39;root&#39;@&#39;%&#39; to database &#39;netai_test&#39;问题
  4. Android ListView 进阶学习
  5. xml入门
  6. Mysql 更改最大连接数
  7. 格式化说明符定义、转义字符、枚举、结构体、typedef
  8. 配置hive元数据库mysql时候出现 Unable to find the JDBC database jar on host : master
  9. [总结]FFMPEG视音频编解码零基础学习方法
  10. java_method_Log输出日志的方法
  11. Unity 角色复活和重新开始游戏
  12. DSOframer 无法正常加载的解决方案
  13. 普通用户登录Oracle DB Control
  14. 一个可以直接使用的MsgBox基于form居中API
  15. VMware 安装 centos6.8
  16. HDU3440 House Man
  17. net abp core的appservice中访问httpcontext对象
  18. Qt中中文字符 一劳永逸的解决方法
  19. python 阿狸的进阶之路(7)
  20. 探索未知种族之osg类生物---器官初始化一

热门文章

  1. TP5常量
  2. FMX ScrollBox 拖拽控制
  3. Tomcat 异常关闭排查
  4. Gulp的安装与配置
  5. 【完结汇总】iKcamp出品基于Koa2搭建Node.js实战共十一堂课(含视频)
  6. JS中回调函数的使用
  7. Enterprise Library 企业库
  8. The Hard Thing About Hard Things
  9. 删除Eclipse已有的SVN资源库位置
  10. Graph Coloring I(染色)