• 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;
    }
    
  • 相关阅读:
    asp.net图片上传代码
    C#(同步调用、异步调用、异步回调)
    跨线程的控件调用
    C# ListView用法详解 很完整
    获取dataGridView双击时判断双击的是下面的行,还是列头
    加密解密类
    C# 中DataGridView 绑定List<T>做数据源的操作问题
    C#获取当前程序集的完整路径
    接口测试-小结
    接口测试用例
  • 原文地址:https://www.cnblogs.com/hhlya/p/13163792.html
Copyright © 2020-2023  润新知