題目來源:http://noi.openjudge.cn/ch0206/2421/ 2421:Exchange Rates
總時間限制: 1000ms 記憶體限制: 65536kB
描述
Now that the Loonie is hovering about par with theGreenback, you have decided to use your $1000 entrance scholarship to engage incurrency speculation. So you gaze into a crystal ball which predicts theclosing exchange rate between Canadian and U.S. dollars for each of the nextseveral days. On any given day, you can switch all of your money from Canadianto U.S. dollars, or vice versa, at the prevailing exchange rate, less a 3%commission, less any fraction of a cent.
Assuming your crystal ball is correct, what's the maximum amount of money youcan have, in Canadian dollars, when you're done?
輸入
The input contains a number of test cases, followed by aline containing 0. Each test case begins with 0 <d ≤ 365, thenumber of days that your crystal ball can predict. d lines follow, giving theprice of a U.S. dollar in Canadian dollars, as a real number.
輸出
For each test case, output a line giving the maximumamount of money, in Canadian dollars and cents, that it is possible to have atthe end of the last prediction, assuming you may exchange money on any subsetof the predicted days, in order.
範例輸入
3
1.0500
0.9300
0.9900
2
1.0500
1.1000
0
範例輸出
1001.60
1000.00
-----------------------------------------------------
解題思路
動態規劃,分別維護更新當前美元最大收益和當前加元最大收益。不用開數組,用4個變數就行。
兩個坑點:
1. 計算中要用分為單位用int變數計算
2. 輸出的時候要保留兩位小數精度,例如這樣就可以AC
ans0 = thecanada/100;ans1 = thecanada%100;printf("%d.%02d\n",ans0,ans1);
-----------------------------------------------------
代碼
#include<stdlib.h>#include<iostream>#include<fstream>#include<iomanip>#include<stdio.h>using namespace std;int main(){ #ifndef ONLINE_JUDGE ifstream fin("xly2016E.txt"); if (!fin) { exit(1); } int d = 0, i = 0; double therate = 0; int theusa = 0, thecanada = 0, n_usa = 0, n_canada = 0; int ans0 = 0, ans1 = 0; while (fin >> d) { if (d==0) { break; } thecanada = 1000*100; // 以“分”為單位 theusa = 0; for (i=0; i<d; i++) { fin >> therate; n_usa = thecanada/therate*0.97; // 將第i-1天開始持有的加元換成美元 theusa = n_usa>theusa? n_usa:theusa; // 與繼續持有第i-1天的美元比較取大者 n_canada = theusa*therate*0.97; // 將第i-1天開始持有的美元換成加元 thecanada = n_canada>thecanada? n_canada:thecanada;// 與繼續持有第i-1天的加元比較取大者 } ans0 = thecanada/100; ans1 = thecanada%100; printf("%d.%02d\n",ans0,ans1); } fin.close(); #endif // LOCAL FILE #ifdef ONLINE_JUDGE int d = 0, i = 0; double therate = 0; int theusa = 0, thecanada = 0, n_usa = 0, n_canada = 0; int ans0 = 0, ans1 = 0; while (cin >> d) { if (d==0) { break; } thecanada = 1000*100; // 以“分”為單位 theusa = 0; for (i=0; i<d; i++) { cin >> therate; n_usa = thecanada/therate*0.97; // 將第i-1天開始持有的加元換成美元 theusa = n_usa>theusa? n_usa:theusa; // 與繼續持有第i-1天的美元比較取大者 n_canada = theusa*therate*0.97; // 將第i-1天開始持有的美元換成加元 thecanada = n_canada>thecanada? n_canada:thecanada;// 與繼續持有第i-1天的加元比較取大者 } ans0 = thecanada/100; ans1 = thecanada%100; printf("%d.%02d\n",ans0,ans1); } #endif // ONLINE_JUDGE}