美元汇率【贪心算法练习题】

简介: 题目链接:http://tyvj.cn/p/1095https://www.luogu.org/problem/show?pid=1968描述在以后的若干天里戴维将学习美元与德国马克的汇率。编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值。

题目链接:

http://tyvj.cn/p/1095

https://www.luogu.org/problem/show?pid=1968

描述

在以后的若干天里戴维将学习美元与德国马克的汇率。编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值。

输入格式

输入文件的第一行是一个自然数N,1≤N≤100,表示戴维学习汇率的天数。
接下来的N行中每行是一个自然数A,1≤A≤1000。第i+1行的A表示预先知道的第i+1天的平均汇率,在这一天中,戴维既能用100美元买A马克也能用A马克购买100美元。

输出格式

输出文件的第一行也是唯一的一行应输出要求的钱数(单位为美元,保留两位小数)。

测试样例1

输入

5
400
300
500
300
250

输出

266.67

备注

Day 1 ... changing 100.0000 美元= 400.0000 马克
Day 2 ... changing 400.0000 马克= 133.3333 美元
Day 3 ... changing 133.3333 美元= 666.6666 马克
Day 5 ... changing 666.6666 马克= 266.6666 美元

 

解题思路(http://tyvj.cn/Solution/6521)

 AC代码:

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int i,n;
 5     double a[3],sum;
 6     scanf("%d",&n);
 7     sum = 100;
 8     scanf("%lf%lf",&a[0],&a[1]);
 9     for (i=0;i<n-1;i++)
10     {
11         if (a[0] > a[1])
12             sum *= (double)a[0]/a[1];
13         scanf("%lf",&a[2]);
14         a[0]=a[1];
15         a[1]=a[2];
16     }
17     printf("%.2lf\n",sum);
18     return 0;
19 }

可以参考阅读的代码(一):

 1 #include <stdio.h>
 2 #define max_data 100
 3 int main(void)
 4 {
 5     int i;
 6     int n;
 7     int a[max_data];
 8     double sum;
 9     scanf("%d",&n);
10 
11     for (i = 0;i < n;++i)
12         scanf("%d",a + i);
13     sum = 100;
14 
15     for (i = 0;i < n - 1;++i)
16         if (a[i] > a[i + 1])
17             sum *= (double) a[i] / a[i + 1];
18 
19     printf("%.2lf\n",sum);
20 
21     return 0;
22 }

可以参考阅读的代码(二):

 来源:http://blog.csdn.net/wxf1995/article/details/6007723#

 1     #include<stdio.h>  
 2     #include<iostream>  
 3     using namespace std;  
 4     const int N=100;  
 5     double ans[N+1][2];//0维表示美元 1维表示马克   
 6     double num[N+1];//num[i]的马克可以在第i天换100美元   
 7     int n;  
 8     void input()  
 9     {  
10         scanf("%d",&n);  
11         for (int i=1;i<=n;i++)  
12         {  
13             scanf("%lf",&num[i]);  
14         }  
15         return;  
16     }  
17     void prime()  
18     {  
19         ans[0][0]=100.0;  
20         for (int i=1;i<=n;i++)  
21         {  
22             ans[i][0]=ans[i-1][0];  
23             ans[i][1]=ans[i-1][1];  
24             for (int j=1;j<i;j++)  
25             {  
26                 ans[i][0]=max(ans[j][1]/num[i]*100.0,ans[i][0]);//换成美元   
27             }  
28             for (int j=0;j<i;j++)  
29             {  
30                 ans[i][1]=max(ans[j][0]*num[i]/100.0,ans[i][1]);//换成马克  
31             }  
32         }  
33         printf("%.2lf",ans[n][0]);  
34         return;  
35     }  
36     int main()  
37     {  
38         input();  
39         prime();  
40         return 0;  
41     }  

本代码解析:

每一天所能拥有的最大的价值肯定要么是全马克,要么全是美元(不解释)

所以可以记录第i天所能拥有的最大马克数和美元数,来递推

ans[i][1]表示第i天所能拥有的最多的马克

ans[i][0]表示第i天所能拥有的最多的美元

自然

ans[i][1]=ans[i-1][1];

ans[i][1]=max(ans[j][0]*num[i]/100.0,ans[i][1]);//换成马克

ans[i][0]也同理

 

 

相关文章
|
6月前
|
算法 测试技术 索引
动态规划算法练习题
动态规划算法练习题
38 0
|
6月前
|
算法 测试技术 调度
数据结构与算法 贪心
数据结构与算法 贪心
100 1
|
6月前
|
算法
贪心算法练习题
贪心算法练习题
35 0
|
6月前
|
算法
回溯算法练习题
回溯算法练习题
37 0
|
存储 算法
每日一题,贪心算法的简单应用
每日一题,贪心算法的简单应用
|
6月前
|
算法 定位技术
每日刷题|贪心算法初识
每日刷题|贪心算法初识
|
算法
[蓝桥杯] 递归与递推习题训练
蓝桥杯比赛只有四十天左右啦,最近会按照模块更新一些有关蓝桥杯算法题。学习算法不仅仅是为了参见比赛,更是以后找工作的一个敲门砖。废话不多说,我们直接看题。
77 0
每日刷题|回溯法解决组合问题
每日刷题|回溯法解决组合问题
|
算法
算法 - 蓝桥杯并查集题型
算法 - 蓝桥杯并查集题型
|
算法
贪心算法例题
贪心算法例题
96 0