加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

NOIP2015 T4 推销员

发布时间:2020-12-15 04:55:05 所属栏目:百科 来源:网络整理
导读:题面 【问题描述】 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住房。螺丝街一构有N 家住房,第i 家住户到入口的距离为si 米。由于同一栋房子里可以有多家住户,所以可能有多

题面

【问题描述】

阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住房。螺丝街一构有N 家住房,第i 家住户到入口的距离为si 米。由于同一栋房子里可以有多家住户,所以可能有多家住房与入口的距离相等。阿明会从入口进入,依次向螺丝街的X 家住房推销产品,然后再原路走出去。阿明每走1 米就会积累1 点疲劳值,向第i 家住房推销产品会积累Ai 点疲劳值。阿明是工作狂,他想知道,对于不同的X,在不走多余路的前提下,他最多可以积累多少点疲劳值。

【输入格式】


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


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


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


【输出格式】


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

思路

我见过NOIP T4最水的题,没有之一。


这道题算法为贪心(废话),但应该怎么贪呢?


首先,通过我们分析可得,最大值一定是取x个最大值+2*已取数的最大距离或x-1个最大值+2*所有数的最大距离+最远且最大的数。所以需要三个数组,sum(前x个数的总和),maxlen(前x个数最远距离),h(2*所有数的最大距离+最远且最大的数)

代码

1 #include

2 using namespace std;

3 int n,sum[100005],maxlen[100005],h[100005];

4 struct node{int s,a;}x[100005];

5 bool cmp(node p,node q)

6 {

7 return p.a>q.a;

8 }

9 int main()

10 {

11 cin>>n;

12 for (int i=1;i<=n;i++) cin>>x[i].s;

13 for (int i=1;i<=n;i++) cin>>x[i].a;

14 sort(x+1,x+n+1,cmp);

15 for (int i=1;i<=n;i++) sum[i]=sum[i-1]+x[i].a;

16 for (int i=1;i<=n;i++) maxlen[i]=max(maxlen[i-1],x[i].s);

17 for (int i=n;i>=1;i--) h[i]=max(h[i+1],x[i].s*2+x[i].a);

18 for (int i=1;i<=n;i++) cout<

19 return 0;

20 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读