这大概是我见过最水的紫题吧~ 洛谷标签赞一个!
题意:你有一年时间,把10w元存银行变成更多钱,在特定时间区间内,你会有一些利息,不过不可中途退出。
直接dp:st[i]表示区间左端点,ed[i]表示右端点,a[i]表示利率。
f[i]表示第i天的最大值。直接循环每天和每个套餐转移即可。
code:
#include <bits/stdc++.h>
using namespace std;
const int month[]={0,0,31,59,90,120,151,181,212,243,273,304,334,365};
double f[400]={100000},a[10010];
int n,st[10010],ed[10010];
int main()
{
cin>>n;
int x,y,d;double c;
for (int i=1;i<=n;++i) {
scanf("%2d%2d%d%lf",&x,&y,&d,&c);
a[i]=c*0.01*(d/365.0)+1;
st[i]=month[x]+y;
ed[i]=st[i]+d-1;
}
for (int i=1;i<=365;++i) {
f[i]=f[i-1];
for (int j=1;j<=n;++j) {
if (ed[j]!=i) continue;
f[i]=max(f[i],f[st[j]-1]*a[j]);
}
}
printf("%.2lf",f[365]);
return 0;
}