zoukankan      html  css  js  c++  java
  • Luogu p2672 推销员 (贪心)

    题目链接:戳我

    思路

    贪心的好题目,首先我们要走n家的推销,所以我们会有直接的想法就是取前n大的推销疲劳值的人家进行销售,但是这个时候我们发现距离也是产生疲劳的一个约束,所以我们考虑在选取前n大的疲劳度的人家进行推销(当然远距离的那个是我们的走路花费疲劳值,这是毫无疑问,贪就完事),会发现如果我们把我们所选取的人家里面花费疲劳值最小的去掉,换成后面距离比较大的,就有可能会取得更多疲劳值,所以这个时候我们取一个max就好了。当然,这个时候我们需要证明,为什么只去掉最小,而不去掉更多,仔细想一想,我们所花费距离疲劳值的是最远的的距离所决定的,当我们贪心的用推销疲劳值换取距离疲劳的时候,索取的已经是之前没有取到的最大距离疲劳了,所以你再多取反而是没有意义的。(再次感叹,这是道好题,哈哈哈)。

    代码实现

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    const int maxn=1005;
    int n;
    int sum[maxn],q[maxn],later[maxn];
    struct node {
        int dis,p;
    };
    node e[maxn];
    bool camp (node x,node y) {
        return x.p>y.p;
    }
    int main () {
        cin>>n;
        for (int i=1;i<=n;i++)  cin>>e[i].dis;
        for (int i=1;i<=n;i++) cin>>e[i].p;
        sort (e+1,e+n+1,camp);
        for (int i=1;i<=n;i++) sum[i]=sum[i-1]+e[i].p;
        for (int i=1;i<=n;i++) q[i]=max(q[i-1],e[i].dis*2);
        for (int i=n;i>=1;i--) later[i]=max(later[i+1],e[i].dis*2+e[i].p);
        for (int i=1;i<=n;i++) cout<<max(sum[i]+q[i],sum[i-1]+later[i])<<endl;
        return 0;
    }
    
  • 相关阅读:
    少壮不努力,老大徒伤悲
    吾日三省吾身
    记录生活
    为人处世
    时间不等人
    博客两年记忆
    抬起头吧
    下一步计划
    寻找遗失的平静
    暑假第二十六测
  • 原文地址:https://www.cnblogs.com/hhlya/p/13163792.html
Copyright © 2011-2022 走看看