卡车更新问题
Description
某人购置了一辆新卡车, 从事个体运输业务. 给定以下各有关数据:
以上各数据均为实型, 单位为”万元”.
设某卡车已使用过
① 如果继续使用, 则第
② 如果卖掉旧车,买进新车, 则第
该运输户从某年初购车日起,计划工作
为使这
Input
第
第
第
第
第
Output
第
第
年序号 ( 从
否更新 ( 当年如果更新,输出
当年回收额 (
Sample Input
4
5
8 7 6 5 4 2
0.5 1 2 3 4 5
0 2 3 5 8 10
Sample Output
24.5
1 0 7.5
2 1 5.5
3 1 5.5
4 0 6.0
Solution
设
若
否则
Code
#include <iostream>
#include <cstdio>
#include <cfloat>
#define Max(x,y) ((x)>(y)?(x):(y))
#define Min(x,y) ((x)<(y)?(x):(y))
using namespace std;
int n,k;
double r[30],u[30],c[30],f[100000][30];
int g[100000][30];
double ans=DBL_MIN;
void work(int year,int x){
if(year==1)return;
work(year-1,g[year][x]);
if(x==1)printf("%d %d %.1lf\n",year,1,f[n][x]-f[n-1][g[year][x]]);
else printf("%d %d %.1lf\n",year,0,f[n][x]-f[n-1][g[year][x]]);
}
int main(){
freopen("truck.in","r",stdin);
freopen("truck.out","w",stdout);
memset(f,0xc2,sizeof f);
double oo=f[0][0];
scanf("%d%d",&n,&k);
for(int i=0;i<=k;i++)scanf("%lf",&r[i]);
for(int i=0;i<=k;i++)scanf("%lf",&u[i]);
for(int i=0;i<=k;i++)scanf("%lf",&c[i]);
f[1][1]=r[0]-u[0];
for(int i=2;i<=n;i++){
for(int j=1;j<=k;j++){
if(j==1){
for(int l=1;l<=k;l++)
if(f[i-1][l]!=oo){
if(f[i-1][l]+r[0]-u[0]-c[l]>f[i][j]){
f[i][j]=f[i-1][l]+r[0]-u[0]-c[l];
g[i][j]=l;
}
}
}
else{
if(f[i-1][j-1]!=oo){
f[i][j]=f[i-1][j-1]+r[j-1]-u[j-1];
g[i][j]=j-1;
}
}
}
}
int ttt;
for(int i=0;i<=k;i++){
if(f[n][i]>ans){
ans=f[n][i];
ttt=i;
}
}
printf("%.1lf\n",ans);
printf("%d %d %.1lf\n",1,0,r[0]-u[0]);
work(n,ttt);
return 0;
}