【JZOJ 5377】 开拓

来源:互联网 发布:java编程技巧 编辑:程序博客网 时间:2024/04/30 10:53

Description

这里写图片描述
这里写图片描述

30%

中规中矩的dp啊
可以发现某一个时刻的能力值只取决于他前面开采和维修的次数
设f[i][j][k]表示做到第i个前面开采,维修次数分别是j,k的答案

智商型dp

之前明明做过类似的题,比赛的时候智商不知道被谁吃了
试一下写出某一种决策的答案
然后会发现从后往前dp就完全把前面的影响消除了,只用记录一维就好

#include<ctime>#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,b,a) for(int i=b;i>=a;i--)#define efo(i,v,u) for(int i=last[v],u=to[i];i;i=next[i],u=to[i])#define max(x,y) ((x)>(y)?(x):(y))#define min(x,y) ((x)<(y)?(x):(y))#define mset(a,x) memset(a,x,sizeof(a))using namespace std;typedef long long ll;typedef double db;const int N=1e5+5;int n;db A,B,w,f[N];struct node{    int tp;db x;}a[N];int main(){    freopen("exploit.in","r",stdin);    freopen("exploit.out","w",stdout);    scanf("%d %lf %lf %lf",&n,&A,&B,&w);A=1-A*0.01,B=1+B*0.01;    fo(i,1,n) scanf("%d %lf",&a[i].tp,&a[i].x);    fd(i,n,1)    {        f[i]=f[i+1];        if(a[i].tp==1) f[i]=max(f[i],a[i].x+A*f[i+1]);        else f[i]=max(f[i],-a[i].x+B*f[i+1]);    }    printf("%.2lf",w*f[1]);    return 0;}
原创粉丝点击