2.17NOIP模拟赛(by hzwer) T1 小奇挖矿

摘要:
小七想开采一些矿产。他驾驶着一艘带钻头的宇宙飞船,按照既定路线依次飞越喵星系的n颗行星。以下n行包含2个整数类型x。如果当前点是维护行星,则可以说是相同的:减少a[i]并将之前的收入增加%c,状态转换方程为f[i]=max。为了使状态转移更方便,我们可以将具有w的原始耐久性的钻机分解为具有一个耐久性的w钻机,并将答案乘以w。

【题目背景】

  小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值 w)的飞船,按既定
  路线依次飞过喵星系的 n 个星球。

【问题描述】

  星球分为 2 类:资源型和维修型。

  1. 资源型:含矿物质量 a[i],若选择开采,则得到 a[i]*p 的金钱,之后钻头
  损耗 k%,即 p=p*(1-0.01k)

  2. 维修型:维护费用 b[i],若选择维修,则支付 b[i]*p 的金钱,之后钻头修
  复 c%,即 p=p*(1+0.01c)(p 为钻头当前能力值)

  注:维修后钻头的能力值可以超过初始值
  请你帮它决策最大化这个收入

【输入格式】

  第一行 4 个整数 n,k,c,w。
  以下 n 行,每行 2 个整数 type,x。
  type 为 1 则代表其为资源型星球,x 为其矿物质含量 a[i];
  type 为 2 则代表其为维修型星球,x 为其维护费用 b[i];

【输出格式】

  输出一行一个实数(保留两位小数),表示要求的结果。

【样例输入】

  5 50 50 10
  1 10
  1 20
  2 10
  2 20
  130

【样例输出】

  375.00

【数据范围】

  对于 30%的数据 n<=100
  对于 50%的数据 n<=1000,k=100
  对于 100%的数据 n<=100000,0<=k,c,w,a[i],b[i]<=100
  保证答案不超过 10^9

【解析】

  这道题从题面就可以看出是一道动态规划的题,但有一点显然的是:前面的决策会影响后面的结果。为了消去前面的影响,我们可以从后边开始动态规划。

  设f[i]表示在第i个星球的最大收入。若当前点为资源型星球,那么如果开采就可以获得当前星球的收入,而由于耐久度会减少,前面所得到的收入要整体下降%k所以状态转移方程为f[i]=max(f[i-1],a[i]+f[i-1]*(1-0.01*k))。若当前点为维修型星球,那么同理可得:减少a[i]并让前面的收入增加%c,状态转移方程为f[i]=max(f[i-1],f[i-1]*(1+0.01*c)-a[i])。为了在状态转移时更加方便,我们可以将原来耐久度为w的钻机分解成w个耐久为一的钻机,最后给答案乘w即可。

  综上所述,状态转移方程为:

  f[i]=max(f[i-1],a[i]+f[i-1]*(1-k%))    (t[i]=1)

  f[i]=max(f[i-1],f[i-1]*(1+c%)-a[i])    (t[i]=2)

【代码】

 1 #include <bits/stdc++.h>
 2 #define N 100002
 3 
 4 using namespace std;
 5 
 6 int n,d[N],a[N],i;
 7 double f[N],k,c,w;
 8 
 9 int main()
10 {
11     freopen("explo.in","r",stdin);
12     freopen("explo.out","w",stdout);
13 
14     cin>>n>>k>>c>>w;
15 
16     for(i=1;i<=n;i++) cin>>d[i]>>a[i];
17 
18     for(i=n;i>=1;i--){
19         if(d[i]==1) f[i]=max(f[i+1],f[i+1]*(1-0.01*k)+a[i]);
20         else f[i]=max(f[i+1],f[i+1]*(1+0.01*c)-a[i]);
21     }
22 
23     f[1]=f[1]*w;
24 
25     cout<<setprecision(2)<<fixed<<f[1]<<endl;
26 
27     return 0;
28 }

  P.S. 转载自LSlzf

免责声明:文章转载自《2.17NOIP模拟赛(by hzwer) T1 小奇挖矿》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python线程类的start()和run()Chromium 修改图片资源下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

VS中,如何将存在于解决方案里,但是没有显示出来的文件(或文件夹)显示到项目中。

不知道有没有人跟我一样,刚开始接触VS的时候,没有通过“右键-˃添加”产生文件,而是直接一些文件或者文件夹建在了项目的本地目录中。导致最后这些文件无法在项目中显示。其实方法很简单如图“Test”文件夹下有一个“Test2”没有显示出来。点击工具栏“显示所有文件”这时就发现之前没有显示的文件就都显示出来了。在想要显示的文件上点击右键,然后点击“包括在项目中”完...

SpringBoot项目中@Async方法没有执行的问题分析

现象:1.明显的现象:在日志文件中找不到方法中的日志输出,并且没有错误报告(即,未执行@Async标记的方法,也没有错误报告)。2.分析现象:日志中某段时间后没有任务xxx线程的日志原因:@Async异步方法默认使用Spring创建ThreadPoolTaskExecutor(参考TaskExecutionAutoConfiguration),其中默认核心线...

PLSQL操作Oracle创建用户和表(含创建用户名和密码)

1》 打开PLSQL,填写用户名和密码,为数据库选择ORCL2,成功登录后可以在界面顶部看到以下信息system@ORCL这意味着用户系统处于登录状态。菜单栏中的会话可以登录和注销。...

flutter 蓝牙开发记录

返回设备ID列表//您可以提前注册以扫描收听事件FlutterBlueflatterBlue=FlutterBlue。例子输出到uisetState((){this._blueDevice.add(r);防止多个扫描操作报告错误)FlutterBlueflatterBlue=FlutterBlue.instance;...

db2数据导出导入del与ixf格式

ixf格式保存的是结构和数据,是一个二进制文件,ixf文件不可视。...

微信小程序-获取input值的两种方法

1、bindinput其中e.detail是获取input数据其中包含value值,cursor是获取光标的位置。...