• 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;
    }
    
  • 相关阅读:
    leetcode第26题--Remove Duplicates from Sorted Array
    leetcode第25题--Remove Element
    leetcode第24题--Reverse Nodes in k-Group
    leetcode第23题--Swap Nodes in Pairs
    leetcode第22题--Merge k Sorted Lists
    leetcode第21题--Generate Parentheses
    leetcode第20题--Valid Parentheses
    leetcode第19题--Remove Nth Node From End of List
    leetcode第18题--Letter Combinations of a Phone Number
    leetcode第17题--4Sum
  • 原文地址:https://www.cnblogs.com/hhlya/p/13163792.html
Copyright © 2020-2023  润新知