【NOIP2015普及组】推销员
在下蒟蒻,欢迎各位大佬与我交流,此处为我洛谷空间
题目描述:
题目出处
【问题描述】
阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有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普及组】推销员相关推荐
- NOIP2015普及组第1题 45 金币 方法三(python3实现)
OpenJudge - 45:金币 信息学奥赛一本通(C++版)在线评测系统 [NOIP2015 普及组] 金币 - 洛谷 n=int( input() )x=1 #x为每天收到的金币数sum=0t= ...
- 信息学奥赛一本通 1970:【15NOIP普及组】扫雷游戏 | OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 | 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏
[题目链接] ybt 1970:[15NOIP普及组]扫雷游戏 OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏 [题目考点] 1 ...
- 信息学奥赛一本通 1100:金币 | 1969:【15NOIP普及组】金币 | OpenJudge NOI 1.5 45 | 洛谷 P2669 [NOIP2015 普及组] 金币
[题目链接] ybt 1100:金币 ybt 1969:[15NOIP普及组]金币 OpenJudge NOI 1.5 45:金币 洛谷 P2669 [NOIP2015 普及组] 金币 [题目考点] ...
- ◆竞赛题目◆◇NOIP2015普及组◇求和
◇NOIP2015普及组◇求和 Description 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字 ...
- noip2015普及组真题详解
第二十一届全国青少年信息学奥林匹克联赛初赛 普及组 C++ 语言试题 竞赛时间: 2015 年 10 月 11 日 14:30-16:30 一.单项选择题 ( 共 20 题,每题 1.5 分,共计 3 ...
- NOIP2015普及组复赛 解题分析
1.金币 算法分析 直接模拟. #include <iostream> #include <cstdio> #include <cstring> using nam ...
- P2671 [NOIP2015 普及组] 求和(前缀和)
文章目录 1.描述: 2. 输入: 3.输出: 4.样例输入: 5.样例输出: 6.题目大意: 7.思路 80分思路: 80分代码 O( n*n ) 100分思路:O( n ) 一百分代码 8.反思 ...
- Noip2015普及组第四题 Salesman的解题报告
[题意分析] 咋一看,这一题可以用贪心做,但是,时间复杂度是O(n*n),只能过60%的数据. [贪心算法](超时,60分) #include<cstdio> #include<cs ...
- 扫雷游戏(NOIP2015 普及组第二题)
描述 扫雷游戏是一款十分经典的单击小游戏. 在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格). 玩家翻开一个非地雷格时,该格将会出现一个数字--提示周围格子中有 ...
- 金币(NOIP2015 普及组第一题)
描述 国王将金币作为工资,发放给忠诚的骑士. 第一天骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币:之后四天,每天收到四枚金币,以此类推: ...
最新文章
- 被人恨,但感觉不错!
- 4月23日遇到的问题
- 【大神】软件建模仿真空气冷凝集水器,末日饮水荒野求生水资源解决方案
- 【学习笔记】SAP CO模块概念信息(上)
- 从字节码看java中 this 的隐式传参
- 基于jQuery向下弹出遮罩图片相册
- 面试—每日一题(8)
- UVA10267 Graphical Editor【模拟】
- Linux系统下如何设置IP地址?
- 移动深度学习:人工智能的深水区
- Matlab调用系统命令行利用Internet Download Manager(IDM)实现批量下载
- oracle日期如何比较,Oracle日期比较
- S32K14x MCAL配置之MCU
- verilog赋多位值_verilog语句两个always块对同一个变量赋值问题!【恢复】
- 你就不怕此生就这样?
- 学习自旋电子学的笔记04:模拟自旋波在弯曲磁畴壁中传播
- linux解压时,z x v f分别代表什么意思
- 密集预测任务的多任务学习(Multi-Task Learning)研究综述 - 网络结构篇(上)
- 入驻QQ一天就爆满,Midjourney中文版来了
- 第4次作业类测试代码+105032014070+胡阳洋