卡车更新问题
2016-07-04 10:03
253 查看
问题描述 Problem Description
某人购置了一辆新卡车, 从事个体运输业务. 给定以下各有关数据: Rt:t=0,1,2,...,k 表示已使用过 t 年的卡车, 再工作一年所得的运费, 它随 t 的增加而减少, k(k≤20) 年后卡车已无使用价值.Ut:t=0,1,...,k 表示已使用过 t 年的卡车, 再工作一年所需的维修费, 它随 t 的增加而增加.
Ct:t=0,1,2,...,k 表示已使用过 t 年的旧卡车, 卖掉旧车, 买进新车, 所需的净费用, 它随 t 的增加而增加. 以上各数据均为实型, 单位为”万元”.
设某卡车已使用过 t 年,
①如果继续使用, 则第 t+1 年回收额为 Rt−Ut ,
②如果卖掉旧车, 买进新车, 则 第 t+1 年回收额为 R0−U0−Ct .
该运输户从某年初购车日起, 计划工作 N(N≤20) 年, N 年后不论车的状态如何,不再工作. 为使这 N 年的总回收额最大, 应在哪些年更新旧车? 假定在这 N 年内, 运输户每年只用一辆车, 而且以上各种费用均不改变.
输入描述 Input Description
第 1 行: N (运输户工作年限)第 2 行: k (卡车最大使用年限, k≤20 )
第 3 行: R0 R1 ... Rk
第 4 行: U0 U1 ... Uk
第 5 行: C0 C1 ... Ck
输出描述 Output Description
第 1 行: W(N 年总回收额 )第 2~N+1 行: 每行输出 3 个数据:
年序号 ( 从 1 到 N 按升序输出 );
否更新 ( 当年如果更新, 输出 1 , 否则输出 0 );
当年回收额 ( N 年回收总额应等于 W ).
输入样例 Sample Input
45
8 7 6 5 4 2
0.5 1 2 3 4 5
0 2 3 5 8 10
输出样例 Sample Output
24.51 0 7.5
2 1 5.5
3 1 5.5
4 0 6.0
分析 I Think
题目已经把状态转移方程差不多都给了…代码 Code
#include <cstdio> #include <string> #include <cmath> #include <algorithm> using namespace std; const double eps = 1E-8; double r[22],u[22],c[22]; double f[22][22]; int n,k; void display(int,int); int main(){ 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]); r[k+1] = -1E20; u[k+1] = c[k+1] = 1E20; for(int i=0;i<=n;++i) for(int j=0;j<=k;++j) f[i][j] = -1E20; f[1][1] = r[0]-u[0]; for(int i=1;i<n;++i) for(int j=1;j<=k;++j){ f[i+1][j+1] = max(f[i+1][j+1],f[i][j]+r[j]-u[j]); f[i+1][1] = max(f[i+1][1],f[i][j]+r[0]-u[0]-c[j]); } double ans = -1E20; int p; for(int i=0;i<=k;++i) if(ans < f [i]){ ans = f [i]; p = i; } printf("%.1lf\n",ans); display(n,p); return 0; } void display(int p,int q){ if(p == 1){ printf("1 0 %.1lf\n",f[1][1]); return ; } if(q == 1) for(int i=1;i<=k;++i) if(fabs(f[p-1][i]+r[0]-u[0]-c[i]-f[p][q]) < eps){ display(p-1,i); printf("%d 1 %.1lf\n",p,r[0]-u[0]-c[i]); return ; } display(p-1,q-1); printf("%d 0 %.1lf\n",p,r[q-1]-u[q-1]); }
相关文章推荐
- 爬坑小记-Java里面的代码块讲解
- 每天学习一算法系列(5)(已知两个数组,数组里的元素有正有负,但是都是按照从小到大已经排好序,要求用尽可能小的时间复杂度编写一算法求出两个数组的最大交集)
- Android中观察者模式的升入理解
- Linux内核里的DebugFS
- Linux的后台执行进程之nohup
- XZ_iOS中textField的键盘弹出和回收导致的界面上移和下移
- hihoCoder 1322:树结构判定
- 详解C语言 三大循环 四大跳转 和判断语句
- 【JLOI2015】战争调度(war)
- leetcode278.First Bad Version 关于有符号数加法溢出的错误
- 2851 菜菜买气球
- 使用缓存技术来提高性能之——OSCache缓存技术入门(二)
- Xcode 中的相对路径与绝对路径的相关设置
- spring的Scheduled(定时任务)和多线程
- 白话scala系列三 Scala编程难点解析
- 一个全屏PopupWindow的小问题
- IReport环境搭建
- 关于Unity中 截图跳转分享界面的问题
- 织梦dedecms栏目添加自定义字段,增加栏目上传缩略图功能
- iOS 图片不变形拉伸