题意:
现在有一条长度为L的道路,在道路上有一些陷阱,然后他跨过每米陷阱所花费的体力为A,他在平地上每米所能获得体力为B,然后他必须保持在每米体力都保持大于等于0,然后为了保证这个条件,问你他一开始所需要保存的最少体力为多少。
思路:
很简单的一道想法题,但是一开始我想烦了,还分类讨论,后来队友思路清晰就把它A了。
我们只需要对每一段计算在遇到沼泽之前所积累的体力以及在走过沼泽的那段路程时减少的体力值。如果小于0,那么我们就得事先积累那么多的体力值。然后对这n段都这么做就好了。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
#define maxn 100010
int l[maxn],r[maxn];
int main(){
int T,jj=1;
scanf("%d",&T);
while(T--){
int n,A,B,L;
scanf("%d%d%d%d",&n,&A,&B,&L);
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
for(int i=1;i<=n;i++){
scanf("%d%d",&l[i],&r[i]);
}
int ans=0,res=0;
ans+=(l[1]-0)*B-(r[1]-l[1])*A;
if(ans<0) res+=fabs(ans),ans=0;
for(int i=2;i<=n;i++){
ans+=(l[i]-r[i-1])*B-(r[i]-l[i])*A;
if(ans<0) res+=fabs(ans),ans=0;
}
printf("Case #%d: %d\n",jj++,res);
}
}