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