题目:洛谷P2672、codevs5126、Vijos P1977

题目大意:有个推销员要去推销,要你求他推销1~n户人家分别最多花多少“疲劳值”。具体见题目。

解题思路:如果用$O(n^2)$做的话,可以得到60分。如何得到满分呢?

贪心,先选择$s[i]*2+a[i]$值最大的一个点,并将这个点记为now,用堆保存now左边的点的疲劳值。每次选择点时,取出左边疲劳值最大的点,枚举now右边的点j,找出右边疲劳值最大的点(这里要加上2*(now到j的距离)),两个比较,取大值。如果左边的大,则直接弹出堆,否则将now更新,把old_now+1~new_now-1之间的点的$a[i]$扔进堆里即可。时间复杂度,最好情况下是$O(n log n)$,最坏情况下是$O(n^2)$,数据比较平均,所以能得满分。

此题我在取出堆元素时没有判断是否为空,然而在上面的OJ中提交都没有出错,说明最坏情况并没有出现在数据中。

C++ Code:

#include<cstdio>
#include<ext/pb_ds/priority_queue.hpp>
__gnu_pbds::priority_queue<int>ld;
int n;
int a[100005],s[100005];
int main(){
scanf("%d",&n);
int mxi=0,mx=0;
for(int i=1;i<=n;++i)scanf("%d",&s[i]);
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
if(s[i]*2+a[i]>mx){
mx=s[i]*2+a[i];
mxi=i;
}
printf("%d\n",mx);
for(int i=1;i<mxi;++i)ld.push(a[i]);
int now=mxi;
for(int i=2;i<=n;++i){
int lmax=0,rmax=0,ri=0;
if(!ld.empty())lmax=ld.top();
for(int j=now+1;j<=n;++j)
if(s[j]*2-s[now]*2+a[j]>rmax){
rmax=s[j]*2-s[now]*2+a[j];
ri=j;
}
if(lmax>rmax){
mx+=lmax;
ld.pop();
}else{
mx+=rmax;
for(int j=now+1;j<ri;++j)
ld.push(a[j]);
now=ri;
}
printf("%d\n",mx);
}
return 0;
}

[NOIP2015普及组]推销员的更多相关文章

  1. NOIP2015普及组总结

    NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...

  2. [NOIP2015 普及组] 扫雷游戏

    [NOIP2015 普及组] 扫雷游戏 难度:入门 题目描述 扫雷游戏是一款十分经典的单机小游戏.在nn行mm列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开 ...

  3. NOIP2015普及组第四题推销员

    好久没有写博客了,今天再写一篇.还是先看题: 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家 ...

  4. 洛谷【P2669】NOIP2015普及组 T1金币

    我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P266 ...

  5. 【NOIP2015普及组】推销员_详解

    题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...

  6. NOIP2015普及组T4推销员(暴力+线段树)

    题目:阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为Si米.由于同一栋房子里 ...

  7. 【NOIP2015普及组】 推销员(纪中数据-标准)

    题目 [题目描述] 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 i 家住户到入口的距离为 ...

  8. NOIP2015普及组复赛A 推销员

    题目链接:https://ac.nowcoder.com/acm/contest/243/A 题目大意: 略 分析: 方法就是把疲劳值从小到大排个序,然后从尾部开始一个一个取,当选到第i(i > ...

  9. [NOIP2015] 普及组

    金币 模拟 #include<iostream> #include<cstdio> using namespace std; int main(){ int k,n; scan ...

随机推荐

  1. Unity碰撞和触发的区别

    碰撞的必要条件: 2个都有Collider,且至少有一个刚体.带刚体的身上会检测OnCollision事件,stay就是2个一直在碰着. 触发的必要条件: 至少有一个碰撞器勾选了IsTrigger,至 ...

  2. ZBrush中的布料技巧分享

    今天主要给大家介绍一种在ZBrush®3D图形绘制软件中创建特定类型的布料的技巧,这种方法简单却非常强大. 这个想法源自下面这张图: 我们今天所要讲的技巧可能不是实现复杂的服装设计最有效的方法,但确实 ...

  3. 动态生成的dom元素绑定事件

    要求:要绑定到父元素上$(".school_Inlists").on("click",".chose_Inbtn",function(){ ...

  4. 1、Attention_based Group recommendation——基于注意力机制的群组推荐

    1.摘要: 本文将Attention-based模型和BPR模型结合对给定的群组进行推荐项目列表. 2.算法思想: 如图: attention-based model:[以下仅计算一个群组的偏好,多个 ...

  5. Jmeter中模拟多用户执行多场景操作

    1.其实一个用户组就是一个场景(Thread Group).可以在一个测试计划中进行多个场景的执行,在测试计划下加一个全局的User Defined Variables,在这个里面可以设置执行总数to ...

  6. linux 源码包安装拾遗

    源码包安装和apt-get/yum的区别 安装前的区别:概念上的区别 rpm和dpkg包是经过编译过的包,并且其安装位置由厂商说了算,厂商觉得安装在哪里合适,就会装在哪里,而源码包则是没有经过编译的文 ...

  7. C/C++中的段错误(Segmentation fault)[转]

    Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的. 来自:http://oss.lzu.edu.cn/blog/article.php ...

  8. Tensorflow 读写 tfrecord 文件(Python3)

    TensorFlow笔记博客:https://blog.csdn.net/xierhacker/article/category/6511974 写入tfrecord文件 import tensorf ...

  9. JS实现缓存运动

                                                                                                      JS ...

  10. Spring配置文件中指定init-method属性的作用

    bean 配置文件属性 init-method 用于在bean初始化时指定执行方法,用来替代继承 InitializingBean接口.相关链接:https://www.cnblogs.com/Joe ...