题目:题目链接
题意:初始有加拿大的$1000,给出每天一个美国美元与加拿大美元的兑换率,每次兑换需要花费3%的手续费,并且还
会把小于美分的给省去,问最后最多有多少加拿大美元。
分析:dp[i][0]为第i天最多有多少加拿大美元,dp[i][1]为第i天最多有多少美国美元,
dp[i][0]=max(dp[i-1][0],update(dp[i-1][1]*per*0.97));
dp[i][1]=max(update(dp[i-1][0]/per*0.97),dp[i-1][1]);
up是舍去美分以下的数(这个是关注大牛的)。
总的来说就是一个简单的DP,不过题目看了好久,更纠结的是一开始我一直在用G++交,WA,后来试了一下C++,竟然A了,这个,我就不晓得了,求解释:
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
using namespace std;
double dp[400][2];
double up(double x)
{
x *= 100.0;
int y = (int)x;
return y/100.0;
}
int n;
int main()
{
while(scanf("%d", &n),n)
{
dp[0][0] = 1000.0;
dp[0][1] = 0;
for(int i = 1; i <= n; ++i)
{
double per;
scanf("%lf", &per);
dp[i][0] = max(dp[i-1][0], up(dp[i-1][1]*per*0.97));
dp[i][1] = max(up(dp[i-1][0]/per*0.97), dp[i-1][1]);
}
printf("%.2lf\n", dp[n][0]);
}
return 0;
}
努力努力...