在下蒟蒻,欢迎各位大佬与我交流,此处为我洛谷空间

题目描述:

题目出处

【问题描述】

阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有N 家住户,第i家住户到入口的距离为 Si 米。由于同一栋房子里可以有多家住户,所以可能有多家住户与入口的距离相等。阿明会从入口进入,依次向螺丝街的X家住户推销产品,然后再原路走出去。

阿明每走 1 米就会积累 1 点疲劳值,向第 i 家住户推销产品会积累 Ai点疲劳值。阿明是工作狂,他想知道,对于不同的X,在不走多余的路的前提下,他最多可以积累多少点疲劳值。

第一行有一个正整数 N,表示螺丝街住户的数量。

接下来的一行有 N个正整数,其中第i个整数Si表示第 i家住户到入口的距离。数据保证S1≤S2≤…≤Sn<108。

接下来的一行有 N 个正整数,其中第 i 个整数 Ai表示向第 i 户住户推销产品会积累的疲劳值。数据保证Ai<103

输出N行,每行一个正整数,第 i行整数表示当X=i时,阿明最多积累的疲劳值。

题目大意:

一个数轴,从原点向某个正半轴i点走,会消耗相应的推销消耗和该点与原点的距离*2(要走回去)。求推销x(x=1~n)个点时最大疲劳值。

注:因为只走一趟,所以推销另一个点走过的距离推销该点不用再走。

题目想法

要求求出最多疲劳值,且题为推销第i-1个点的最大疲劳值推出推销第i个点的最大疲劳值的状态转移, 所以首先应想到DP,

但根据同僚的实验得出最快也是O(N*N),且会超时,于是转换思想,想到求最大值也可用贪心。

但问题仍存在,排序无法避开一个问题,推销完一个点后原点相当于来到了已推销过的最右的一点的位置,所以,大小顺序会发生改变,重排复杂度太高,所以转向根堆(我最开始向再外部用一个数组表示此时高度,但发现根堆无法解决如此不稳定的排序,于是取出更换解决)

对每一个需要改变的结构体o(每一个可推销的点用结构体(s表示推销消耗,d表示离原点的距离,id表示在原数组(用一个数组存每个点离零点的距离)中的下标)存入根堆中)做如下操作:

判断是否大于现在的原点len:

如果是,o.d=k[o.id]-len

如果否,o.d=0

操作结束后取出顶点算出推销该点的消耗并累加,代码如下。

题目代码

#include<cstdio>
#include<queue>
using namespace std;
const int M=100001;
void read(int &x)
{x=0;int f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=0-f;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;return ;
}
int max(int a,int b)
{if(a>b)return a;return b;
}
struct node{int s,d,id;
}o;
int n,len,ans,k[M];
bool operator <(node a,node b) //大根堆用小于。
{if(a.s+a.d*2!=b.s+b.d*2)//根据题意比较重载。return a.s+a.d*2<b.s+b.d*2;
}
priority_queue<node>q;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)read(k[i]);for(int i=1;i<=n;i++){read(o.s);o.d=k[i];o.id=i;q.push(o);} for(int i=1;i<=n;i++){while(!q.empty()&&max(k[q.top().id]-len,0)<q.top().d)//不为0就为k[q.top().id]-len(见题目大意);{o=q.top();q.pop();o.d=max(k[o.id]-len,0);q.push(o);}o=q.top();q.pop();if(k[o.id]>len){ans+=(k[o.id]-len)*2;//因为是来回,所以*2len=k[o.id];}ans+=o.s;printf("%d\n",ans);}
}//代码就这么短,所以为大水题

谢谢观看

【NOIP2015普及组】推销员相关推荐

  1. NOIP2015普及组第1题 45 金币 方法三(python3实现)

    OpenJudge - 45:金币 信息学奥赛一本通(C++版)在线评测系统 [NOIP2015 普及组] 金币 - 洛谷 n=int( input() )x=1 #x为每天收到的金币数sum=0t= ...

  2. 信息学奥赛一本通 1970:【15NOIP普及组】扫雷游戏 | OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 | 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏

    [题目链接] ybt 1970:[15NOIP普及组]扫雷游戏 OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏 [题目考点] 1 ...

  3. 信息学奥赛一本通 1100:金币 | 1969:【15NOIP普及组】金币 | OpenJudge NOI 1.5 45 | 洛谷 P2669 [NOIP2015 普及组] 金币

    [题目链接] ybt 1100:金币 ybt 1969:[15NOIP普及组]金币 OpenJudge NOI 1.5 45:金币 洛谷 P2669 [NOIP2015 普及组] 金币 [题目考点] ...

  4. ◆竞赛题目◆◇NOIP2015普及组◇求和

    ◇NOIP2015普及组◇求和 Description 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字 ...

  5. noip2015普及组真题详解

    第二十一届全国青少年信息学奥林匹克联赛初赛 普及组 C++ 语言试题 竞赛时间: 2015 年 10 月 11 日 14:30-16:30 一.单项选择题 ( 共 20 题,每题 1.5 分,共计 3 ...

  6. NOIP2015普及组复赛 解题分析

    1.金币 算法分析 直接模拟. #include <iostream> #include <cstdio> #include <cstring> using nam ...

  7. P2671 [NOIP2015 普及组] 求和(前缀和)

    文章目录 1.描述: 2. 输入: 3.输出: 4.样例输入: 5.样例输出: 6.题目大意: 7.思路 80分思路: 80分代码 O( n*n ) 100分思路:O( n ) 一百分代码 8.反思 ...

  8. Noip2015普及组第四题 Salesman的解题报告

    [题意分析] 咋一看,这一题可以用贪心做,但是,时间复杂度是O(n*n),只能过60%的数据. [贪心算法](超时,60分) #include<cstdio> #include<cs ...

  9. 扫雷游戏(NOIP2015 普及组第二题)

    描述 扫雷游戏是一款十分经典的单击小游戏. 在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格). 玩家翻开一个非地雷格时,该格将会出现一个数字--提示周围格子中有 ...

  10. 金币(NOIP2015 普及组第一题)

    描述 国王将金币作为工资,发放给忠诚的骑士. 第一天骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币:之后四天,每天收到四枚金币,以此类推: ...

最新文章

  1. 被人恨,但感觉不错!
  2. 4月23日遇到的问题
  3. 【大神】软件建模仿真空气冷凝集水器,末日饮水荒野求生水资源解决方案
  4. 【学习笔记】SAP CO模块概念信息(上)
  5. 从字节码看java中 this 的隐式传参
  6. 基于jQuery向下弹出遮罩图片相册
  7. 面试—每日一题(8)
  8. UVA10267 Graphical Editor【模拟】
  9. Linux系统下如何设置IP地址?
  10. 移动深度学习:人工智能的深水区
  11. Matlab调用系统命令行利用Internet Download Manager(IDM)实现批量下载
  12. oracle日期如何比较,Oracle日期比较
  13. S32K14x MCAL配置之MCU
  14. verilog赋多位值_verilog语句两个always块对同一个变量赋值问题!【恢复】
  15. 你就不怕此生就这样?
  16. 学习自旋电子学的笔记04:模拟自旋波在弯曲磁畴壁中传播
  17. linux解压时,z x v f分别代表什么意思
  18. 密集预测任务的多任务学习(Multi-Task Learning)研究综述 - 网络结构篇(上)
  19. 入驻QQ一天就爆满,Midjourney中文版来了
  20. 第4次作业类测试代码+105032014070+胡阳洋

热门文章

  1. 计算机硬盘用u盘维修,电脑维修:U盘和移动硬盘及固态硬盘的区别
  2. 从百度有啊独立看O2O发展的三大趋势
  3. 40个幼儿园小故事,每天讲一个给小朋友~(赶紧收藏)
  4. 360安全卫士推出“极速版”:永久免费、无弹窗广告!
  5. SecureCRT无法键盘输入,无法回车
  6. Win10系统键盘正常但不能输入
  7. python自动化所用到的库介绍
  8. 解决IE兼容性试图模式下,jQuery.min.js的“JSON”未定义
  9. openlayers中海图的加载
  10. permutohedral lattice理解