CodeForces 354A - Vasya and Robot 简单思维..赋初值一定不能随便了T_T

             题意:

                      有一列东西..现在有个机器人要取走这些东西..机器人 有左手和右手...每个物品有重量W1,W2,W3...Wn-1,Wn..左手只能从还剩下的物品最左侧取...右手只能从剩下的物品最右侧取....若机器人用左手取走物品Wi..那么所需要的能量为Wi*l...若机器人用右手取走物品Wi..那么所需要的能量为Wi*r...并且若机器人上一步用左手..这一步也用左手..需要额外付出能量Ql...若机器人上一步用右手..这一步也用右手..需要额外付出能量Qr..现在问要取完所有物品..最少要多少能量 

             题解:

                      思路很简单..因为每次要么从左侧要么从右侧..那么最后的结果肯定是左边的i个是从左侧取的..右边的n-i个是从右侧取的..那么做了预处理后枚举i就好..然后因为连续相同边取会有损失..所以枚举了中点后..可以算出某一侧(只可能一侧)要必须连续取多少次.那么就可以算出当前情况下的代价了..

                      很快就写了.. 然后提交Pretest Passed..结果赛后跑完整数据.居然跪了.一看错得情况.是因为初值给小了...哎...没看清题..根本没注意..


Program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#define ll long long
#define oo 1<<30
#define pi acos(-1.0)
#define MAXN 300005
#define esp 1e-30
using namespace std;    
int a[MAXN],suml[MAXN],sumr[MAXN];
int main()
{  
       int i,n,l,r,L,R,Ql,Qr,ans,w;   
       scanf("%d%d%d%d%d",&n,&l,&r,&Ql,&Qr);
       for (i=1;i<=n;i++) scanf("%d",&a[i]);  
       suml[0]=sumr[n+1]=0;
       for (i=1;i<=n;i++) suml[i]=suml[i-1]+a[i];
       for (i=n;i>=1;i--) sumr[i]=sumr[i+1]+a[i];
       ans=oo;
       for (i=0;i<=n;i++)
       {
              w=suml[i]*l+sumr[i+1]*r;
              L=i,R=n-L;
              if (L>R+1) w+=(L-R-1)*Ql;
              if (R>L+1) w+=(R-L-1)*Qr;
              ans=min(ans,w);
       }
       printf("%d\n",ans);
       return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值