1 条题解

  • 1
    @ 2025-5-16 19:30:53
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int n,sum[100010],q[100010],h[100010];//n 疲劳前缀和 前i个最大值 后i个最大值 
    
    struct node{
        int s;//距离
        int a;//疲劳 
    }v[100010];
    
    bool cmp(node x,node y)
    {
      return x.a>y.a;  //按照疲劳值排序   
      // x=1  1000 
      // x=2  1000+999 
      //x=3   1000+999+998 
      //x=4   1000+999+998+997+4*2  前N项的和
       //        1   2   3   4 
       
       //  2*d+sum[i]    sum[i]-min(a)+ 2*d2+v[j]
    }
    int main()
    {	scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&v[i].s); 
        for(int i=1;i<=n;i++)scanf("%d",&v[i].a);
        
        
        sort(v+1,v+1+n,cmp);//按疲劳排序 
        
        for(int i=1;i<=n;i++)
    	 sum[i]=sum[i-1]+v[i].a; 
        
    	for(int i=1;i<=n;i++)
    	 q[i]=max(q[i-1],2*v[i].s);//前i个最大值
        
    	for(int i=n;i>=1;i--)
    	  h[i]=max(h[i+1],2*v[i].s+v[i].a);//后i个最大值
        for(int i=1;i<=n;i++)
    	  printf("%d\n",max(sum[i]+q[i],sum[i-1]+h[i]));
        return 0;
    }     
    
    • 1

    信息

    ID
    536
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    (无)
    递交数
    49
    已通过
    15
    上传者