洛谷 P1412 经营与开发
Posted 一入OI深似海
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1412 经营与开发相关的知识,希望对你有一定的参考价值。
/* 粘一下开始写的暴力吧 虽然没啥价值 */ #include<iostream> #include<cstdio> #include<cstring> #include<map> #define maxn 100010 using namespace std; int n,type[maxn]; double k,c,w,v[maxn],ans; void Dfs(int p,double t,double m) { if(p==n+1) { ans=max(ans,m); return; } if(type[p]==1)Dfs(p+1,t*(1-double(k/100.0)),m+v[p]*t); if(type[p]==2)Dfs(p+1,t*(1+double(c/100.0)),m-v[p]*t); Dfs(p+1,t,m); } int main() { freopen("exploit.in","r",stdin); freopen("exploit.out","w",stdout); cin>>n>>k>>c>>w; for(int i=1;i<=n;i++) cin>>type[i]>>v[i]; Dfs(1,w,0); printf("%.2f\n",ans); return 0; }
/* 似乎不是dp题 因为前面的决策影响后面的决策 具有后效性 然而他就是dp题 - - 正难则反 我们发现后面的决策对前面的没有影响 但是显然后面的用到前面的决策来确定钻头能力值 我们不先计算出前面的 无法确定后面的能力值 仔细看题目的话 我们会发现前面的对后面的影响只是乘一个数值 那么我们可以先不乘 反着跑 到了前面在乘 对于每一个i 有选或者不选两种情况 (1)资源型:如果选了 那么金钱数变大 能力值变小 对后面的影响就是能力值*k 然后+钱 我们假设每个i的能力值为1*w 有 f[i]=max(f[i+1],f[i+1]*k+v[i]*w); (2)维修型:如果选了 那么金钱数变小 能力值变大 对后面的影响就是能力值*c 然后-钱 同上假设每个i的能力值为1*w 有 f[i]=max(f[i+1],f[i+1]*c-v[i]*w); 注意并不是得到的f[1]就是最优解 所以对所有的f取大 */ #include<iostream> #include<cstdio> #include<cstring> #include<map> #define maxn 100010 using namespace std; int n,type[maxn]; double k,c,w,f[maxn],v[maxn],ans; int main() { cin>>n>>k>>c>>w; for(int i=1;i<=n;i++) cin>>type[i]>>v[i]; k=(100-k)/100.0;c=(100+c)/100.0; for(int i=n;i>=1;i--) { if(type[i]==1) f[i]=max(f[i+1],f[i+1]*k+v[i]*w); if(type[i]==2) f[i]=max(f[i+1],f[i+1]*c-v[i]*w); ans=max(ans,f[i]); } printf("%.2f\n",ans); return 0; }
以上是关于洛谷 P1412 经营与开发的主要内容,如果未能解决你的问题,请参考以下文章