P2672 [NOIP2015 普及组] 推销员

>>>做到最远 返回走 获取价值-》dis[]max*2+Σval[]

-》val尽量取得大-》对val排序-》贪心策略

-》与dis有关 dis在前x内/dis在之外  max(q[i-1]+h[i],q[i]+2*qm[i]))

 

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct home{
    int s,v;
}a[100010];
int q[100010];
int h[100010],qm[100010];
int n;
bool cmp(home a,home b)
{
    return a.v>b.v;
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].s);
    }
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].v);
    }
    sort(a+1,a+1+n,cmp);
    for (int i=n;i>=1;i--)
    {
        h[i]=max(h[i+1],2*a[i].s+a[i].v);
    }
    for (int i=1;i<=n;i++)
    {
        qm[i]=max(qm[i-1],a[i].s);
    }
    for (int i=1;i<=n;i++)
        q[i]=q[i-1]+a[i].v;
    for (int i=1;i<=n;i++)
    {
        printf("%d\n",max(q[i-1]+h[i],q[i]+2*qm[i]));
    }
} 

 

posted @ 2023-09-03 09:52  JMXZ  阅读(9)  评论(0)    收藏  举报