首页 > 其他分享 >【NOIP2015普及组复赛】题4:推销员

【NOIP2015普及组复赛】题4:推销员

时间:2024-05-27 09:03:53浏览次数:21  
标签:24 NOIP2015 疲劳 int 值为 推销员 住户 推销 复赛

题4:推销员

【题目描述】

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

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

【输入】

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

接下来的一行有 N N N 个正整数,其中第 i i i 个整数 S i S_i Si​ 表示第 i i i 家住户到入口的距离。数据保证 S 1 ≤ S 2 ≤ … ≤ S n < 1 0 8 S_1≤S_2≤…≤S_n<10^8 S1​≤S2​≤…≤Sn​<108。

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

【输出】

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

【输入样例1】

5
1 2 3 4 5
1 2 3 4 5

【输出样例1】

15
19
22
24
25

【样例1说明】

X = 1 : X=1: X=1:向住户 5 5 5 推销,往返走路的疲劳值为 5 + 5 5+5 5+5,推销的疲劳值为 5 5 5,总疲劳值为 15 15 15。

X = 2 : X=2: X=2:向住户 4 、 5 4、5 4、5 推销,往返走路的疲劳值为 5 + 5 5+5 5+5,推销的疲劳值为 4 + 5 4+5 4+5,总疲劳值为 5 + 5 + 4 + 5 = 19 5+5+4+5=19 5+5+4+5=19。

X = 3 : X=3: X=3:向住户 3 、 4 、 5 3、4、5 3、4、5 推销,往返走路的疲劳值为 5 + 5 5+5 5+5,推销的疲劳值 3 + 4 + 5 3+4+5 3+4+5,总疲劳值为 5 + 5 + 3 + 4 + 5 = 22 5+5+3+4+5=22 5+5+3+4+5=22。

X = 4 : X=4: X=4:向住户 2 、 3 、 4 、 5 2、3、4、5 2、3、4、5 推销,往返走路的疲劳值为 5 + 5 5+5 5+5,推销的疲劳值 2 + 3 + 4 + 5 2+3+4+5 2+3+4+5,总疲劳值 5 + 5 + 2 + 3 + 4 + 5 = 24 5+5+2+3+4+5=24 5+5+2+3+4+5=24。

X = 5 : X=5: X=5: 向住户 1 、 2 、 3 、 4 、 5 1、2、3、4、5 1、2、3、4、5 推销,往返走路的疲劳值为 5 + 5 5+5 5+5,推销的疲劳值 1 + 2 + 3 + 4 + 5 1+2+3+4+5 1+2+3+4+5,总疲劳值 5 + 5 + 1 + 2 + 3 + 4 + 5 = 25 5+5+1+2+3+4+5=25 5+5+1+2+3+4+5=25。

【输入样例2】

5
1 2 2 4 5
5 4 3 4 1

【输出样例2】

12
17
21
24
27

【样例2说明】

X = 1 : X=1: X=1:向住户 4 4 4 推销,往返走路的疲劳值为 4 + 4 4+4 4+4,推销的疲劳值为 4 4 4,总疲劳值 4 + 4 + 4 = 12 4+4+4=12 4+4+4=12。

X = 2 : X=2: X=2:向住户 1 、 4 1、4 1、4 推销,往返走路的疲劳值为 4 + 4 4+4 4+4,推销的疲劳值为 5 + 4 5+4 5+4,总疲劳值 4 + 4 + 5 + 4 = 17 4+4+5+4=17 4+4+5+4=17。

X = 3 : X=3: X=3:向住户 1 、 2 、 4 1、2、4 1、2、4 推销,往返走路的疲劳值为 4 + 4 4+4 4+4,推销的疲劳值为 5 + 4 + 4 5+4+4 5+4+4,总疲劳值 4 + 4 + 5 + 4 + 4 = 21 4+4+5+4+4=21 4+4+5+4+4=21。

X = 4 : X=4: X=4:向住户 1 、 2 、 3 、 4 1、2、3、4 1、2、3、4 推销,往返走路的疲劳值为 4 + 4 4+4 4+4,推销的疲劳值为 5 + 4 + 3 + 4 5+4+3+4 5+4+3+4,总疲劳值 4 + 4 + 5 + 4 + 3 + 4 = 24 4+4+5+4+3+4=24 4+4+5+4+3+4=24。或者向住户 1 、 2 、 4 、 5 1、2、4、5 1、2、4、5 推销,往返走路的疲劳值为 5 + 5 5+5 5+5,推销的疲劳值为 5 + 4 + 4 + 1 5+4+4+1 5+4+4+1,总疲劳值 5 + 5 + 5 + 4 + 4 + 1 = 24 5+5+5+4+4+1=24 5+5+5+4+4+1=24。

X = 5 : X=5: X=5:向住户 1 、 2 、 3 、 4 、 5 1、2、3、4、5 1、2、3、4、5 推销,往返走路的疲劳值为 5 + 5 5+5 5+5,推销的疲劳值为 5 + 4 + 3 + 4 + 1 5+4+3+4+1 5+4+3+4+1,总疲劳值 5 + 5 + 5 + 4 + 3 + 4 + 1 = 27 5+5+5+4+3+4+1=27 5+5+5+4+3+4+1=27。

【数据说明】

对于 20 % 20\% 20% 的数据, 1 ≤ N ≤ 20 1≤N≤20 1≤N≤20;

对于 40 % 40\% 40% 的数据, 1 ≤ N ≤ 100 1≤N≤100 1≤N≤100;

对于 60 % 60\% 60% 的数据, 1 ≤ N ≤ 1000 1≤N≤1000 1≤N≤1000;

对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 100000 1≤N≤100000 1≤N≤100000。

【代码如下】:

#include<bits/stdc++.h>
using namespace std;
//ifstream cin("salesman.in");
//ofstream cout("salesman.ans"); 
const int maxn=100000;
struct node{
    int s;
    int v;
    bool operator < (node a)const
    {
        return v<a.v;
    }
}e[maxn],s;
priority_queue<node> q;
int n,ans;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>e[i].s;
    for(int i=1;i<=n;i++)
    cin>>e[i].v;
    s.s=s.v=0;
    q.push(s);
    int now=0,maxx=0;
    for(int i=1;i<=n;i++){
        int next=now;
        s=q.top();
        maxx=s.v;
        for(int j=now+1;j<=n;j++)//寻找now以后的最优房屋
        if(e[j].v+(e[j].s-e[now].s)*2>maxx){
            maxx=e[j].v+(e[j].s-e[now].s)*2;
            next=j;
        }
        e[next].v+=(e[next].s-e[now].s)*2;//更新
        if(now!=next)
        q.push(e[next]);//入队
        for(int j=now+1;j<next;j++)//now到next之间的房屋入队
        q.push(e[j]);
        s=q.top();//弹出队位
        ans+=s.v;//加入答案
        q.pop();
        cout<<ans<<endl;//输出
        now=next;//now=next继续寻找最优值
    }
    return 0;
}

标签:24,NOIP2015,疲劳,int,值为,推销员,住户,推销,复赛
From: https://blog.csdn.net/lpstudio/article/details/139225268

相关文章

  • CSP历年复赛题-P1095 [NOIP2007 普及组] 守望者的逃离
    原题链接:https://www.luogu.com.cn/problem/P1095题意解读:在有限的时间内,通过跑步或者闪烁两种方式,能跑出的最远距离是多少,以及是否能跑出出口。解题思路:1、贪心法每一秒钟,都有两种选择:跑步(17米)、闪烁(60米,前提是蓝够10点,否则等待1s恢复4点蓝)经过计算,恢复足够的蓝到闪烁需要3.......
  • 【NOIP2014普及组复赛】题4:子矩阵
    题3:子矩阵【题目描述】给出如下定义:1.子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵。例如,下面左图中选取第2、......
  • 【NOIP2014普及组复赛】题3:螺旋矩阵
    题3:螺旋矩阵【题目描述】一个nnn行nnn列的螺旋矩阵可由如下方......
  • CSP历年复赛题-P1094 [NOIP2007 普及组] 纪念品分组
    原题链接:https://www.luogu.com.cn/problem/P1094题意解读:贪心选择解题思路:贪心策略:将纪念品按价格由小到大排序,优先一大、一小,如果价格之和不超限,则分为一组,如果超限,则大的单独分为一组,重复以上过程,直到所有数据都遍历到,采用一头一尾双指针即可。证明:如果最大价格不是和最......
  • CSP历年复赛题-P1061 [NOIP2006 普及组] Jam 的计数法
    原题链接:https://www.luogu.com.cn/problem/P1061题意解读:从编号s~t的字母从挑w个,组成一种特殊的数字,数字里字母都是升序的,给定初始数字,要计算后5个。解题思路:1、模拟法模拟样例:2105有效字母范围:b,c,d,e,f,g,h,i,j 初始值:bdfij要计算bdfij的下一个,采取如下步骤......
  • CSP历年复赛题-P1046 [NOIP2005 普及组] 陶陶摘苹果
    原题链接:https://www.luogu.com.cn/problem/P1046题意解读:30+伸手的高度,能够得着几个苹果。解题思路:直接模拟。100分代码:#include<bits/stdc++.h>usingnamespacestd;inta[15],h,ans;intmain(){for(inti=1;i<=10;i++)cin>>a[i];cin>>h;......
  • CSP历年复赛题-P1087 [NOIP2004 普及组] FBI 树
    原题链接:https://www.luogu.com.cn/problem/P1087题意解读:字符串作为根,左边一半作为左子树,右边一半作为右子树,递归构造数,并按FBI规则输出后续遍历结果。解题思路:按照题意,通过dfs来构造树,对于字符串str,提取左边一半递归构造左子树,提取右边一半递归构造右子树,前提是字符串长度>1......
  • CSP历年复赛题-P1085 [NOIP2004 普及组] 不高兴的津津
    原题链接:https://www.luogu.com.cn/problem/P1085题意解读:找到两数之和大于8且两数之和最大值的位置解题思路:不多说,送分题,直接模拟法即可100分代码:#include<bits/stdc++.h>usingnamespacestd;inta,b;intmaxx,maxn;intmain(){for(inti=1;i<=7;i++)......
  • CSP历年复赛题-P1044 [NOIP2003 普及组] 栈
    原题链接:https://www.luogu.com.cn/problem/P1044题意解读:一组数入栈、出栈的方案数,如果了解卡特兰数,此题可以秒杀;如果不了解,也可以通过递归或者递推来解决;最次,可以通过DFS暴搜出方案数,当然对于n个数,一共有n次入栈、n次出栈,一共2n次,每次要么入栈要么出栈,总搜索次数在22n规模,n最......
  • CSP历年复赛题-P1045 [NOIP2003 普及组] 麦森数
    原题链接:https://www.luogu.com.cn/problem/P1045题意解读:要计算2p-1的位数和最后500位,实际上只需要计算2p,两者位数一致,前者比后者个位减1即可,且个位肯定不会是0,比较容易处理。解题思路:如果直接采用高精度乘法计算2p,p最大3.1*106,高精度所用数组最长大概9*105,一共最多计算3.......