正题
题目链接:https://www.luogu.com.cn/problem/P1412
题目大意
nnn个地点,有一个能力值为www的稿子
- 如果地点iii是资源型的,那么可以选择获得ai∗wa_i*wai∗w的价值,且w=w∗(1−k100)w=w*(1-\frac{k}{100})w=w∗(1−100k)
- 如果地点iii是维修型的,那么可以选择消耗bi∗wb_i*wbi∗w的价值,且w=w∗(1+c100)w=w*(1+\frac{c}{100})w=w∗(1+100c)
解题思路
发现后面的所有价值相关都是和www有关系的,所以我们没有必要知道www的具体值。考虑倒着做,默认做到现在的位置开始w=1w=1w=1,然后每次看一下在一个地点做不做即可。
时间复杂度O(n)O(n)O(n)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,type[N];double ans,k,c,w,x[N];
int main()
{//freopen("exploit.in","r",stdin);//freopen("exploit.out","w",stdout);scanf("%d%lf%lf%lf",&n,&k,&c,&w);for(int i=1;i<=n;i++)scanf("%d%lf",&type[i],&x[i]);for(int i=n;i>=1;i--){if(type[i]==1)ans=max(ans,(1.0-0.01*k)*ans+x[i]);else ans=max(ans,(1.0+0.01*c)*ans-x[i]);}printf("%.2lf\n",ans*w);
}