[NOIP2015普及组]推销员
题目:洛谷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普及组]推销员的更多相关文章
- NOIP2015普及组总结
NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...
- [NOIP2015 普及组] 扫雷游戏
[NOIP2015 普及组] 扫雷游戏 难度:入门 题目描述 扫雷游戏是一款十分经典的单机小游戏.在nn行mm列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开 ...
- NOIP2015普及组第四题推销员
好久没有写博客了,今天再写一篇.还是先看题: 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家 ...
- 洛谷【P2669】NOIP2015普及组 T1金币
我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P266 ...
- 【NOIP2015普及组】推销员_详解
题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...
- NOIP2015普及组T4推销员(暴力+线段树)
题目:阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为Si米.由于同一栋房子里 ...
- 【NOIP2015普及组】 推销员(纪中数据-标准)
题目 [题目描述] 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家住户,第 i 家住户到入口的距离为 ...
- NOIP2015普及组复赛A 推销员
题目链接:https://ac.nowcoder.com/acm/contest/243/A 题目大意: 略 分析: 方法就是把疲劳值从小到大排个序,然后从尾部开始一个一个取,当选到第i(i > ...
- [NOIP2015] 普及组
金币 模拟 #include<iostream> #include<cstdio> using namespace std; int main(){ int k,n; scan ...
随机推荐
- css3动画机制原理和实战
这段时间喜欢上css3动画效果了,关于这个每个人都有不同的看法,在我个人看来css3在做一些小页面的动画效果还是很好用的,一些简单的小动画要是用js的话,未免浪费. 要是做大一点的话最好js+css3 ...
- How Many Partitions Does An RDD Have
From https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/performance_optimization ...
- 浅谈自底向上的Shell脚本编程及效率优化
作者:沐星晨 出处:http://blog.csdn.net/sosodream/article/details/6276758 浅谈自底向上的Shell脚本编程及效率优化 小论文,大家多批评指导:) ...
- 如何在React-Native上使用Typescript
首先安装脚手架: $ yarn global add create-react-native-app 创建项目: create-react-native-app xxx 进入项目并启动: cd xxx ...
- UVA401-Palindromes(紫书例题3.3)
A regular palindrome is a string of numbers or letters that is the same forward as backward. For exa ...
- python 进程 multiprocessing模块
一.multiprocess.process模块 1.process类 Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得 ...
- poj 2663 Tri Tiling (状压dp+多米诺骨牌问题+滚动数组反思)
本来直接一波状压dpAC的 #include<cstdio> #include<cstring> #include<algorithm> #define REP(i ...
- unity 显示、隐藏Android导航栏
1.下面的返回.home栏可用Screen.fullScreen控制 2.导航栏的显示和隐藏用下面代码控制 private AndroidJavaObject currentActivity { ge ...
- 循环语句第1种 LOOP ... END LOOP;
7)循环语句 --------第1种---------- LOOP ... END LOOP; declare n number(3) := 1; begin LOOP ...
- Spring IoC简介及使用
Spring根本任务 Spring的根本任务就是简化Java开发. 目前许多框架如果要使用他们,就必须要继承或实现这些框架的各种类.这使得框架与我们的程序耦合度过高.由于在我们的程序中加入了过多的框架 ...