hdu 4011 hdu 4011 hdu 4011 hdu 4011
优化了一下,本题因为状态转移方程是临近状态之间的转移,所以可以改为贪心。代码如下
#include <iostream>
#include <cstdio>
using namespace std;
int s[100002];
__int64 min(__int64 a,__int64 b){
return a<b?a:b;
}
int main(){
int ca;
scanf("%d",&ca);
for(int t=1;t<=ca;t++){
int n,a,b;
__int64 sum=0;
scanf("%d%d%d",&n,&a,&b);
for(int i=0;i<n;i++){
scanf("%d",&s[i]);
}
sum+=a*2+b;//刚开时必须去上海花费a工资b,最后一次必须回北京花费a
for(int i=1;i<n;i++){
__int64 x,y;
x=(s[i]-s[i-1])*b;//上次不用回去,只需加上延误的时间
y=2*a+b; //表示上次回去,所以先加上回去的费用a
sum+=min(x,y);//每次sum记录到上次来到上海的最小花费
}
printf("Case #%d: %I64d\n",t,sum);
}
return 0;
}