题解
2024-04-20 11:46:51
发布于:上海
49阅读
0回复
0点赞
#include<iostream>
#include<stack>
#include<iomanip>
using namespace std;
int s[111110]={},if_ai[111110]={};
stack<string> stk;
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>s[i];
int todays_ai=0,sell_day=0;
s[n]=2147483647;
for(int i=0;i<=n;i++){
if(stk.empty()){
if(s[i]>todays_ai)todays_ai=s[i];
else{
stk.push("mark");
sell_day = i-1;
todays_ai = s[i];
}
}
else{
if(s[i]<todays_ai)todays_ai=s[i];
else{
stk.pop();
if_ai[sell_day] = 1;
if_ai[i-1] = 1;
todays_ai = s[i];
}
}
}
double ss=100;
bool a=0;
for(int i=0;i<n;i++){
if(if_ai[i]){
a=!a;
if(a)ss=ss/100.0*s[i];
else ss=ss*100.0/s[i];
}
}
cout<<fixed<<setprecision(2)<<ss<<endl;
return 0;
}
如有需要,可以对照下面代码理解一下如何选择:(贪心)
#include<iostream>
#include<stack>
using namespace std;
int s[111110]={},if_ai[111110]={};//定义数组(array)s,长度为111110,用来存储每天的汇率Ai
//定义array if_ai,存储布尔值0或1,表示不换或换
stack<string> stk;//定义一个stk的栈,用于判断是否美元卖出买入成对
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>s[i];
int todays_ai=0,sell_day=0;//定义int整型变量today_ai,用于存储当天的汇率Ai
//定义int类型变量sell_day,用于存储卖出美元换马克的日子(初始索引为0)
s[n]=2147483647;//为了以防最后一个数据有误,定义最后一项的后一项为int上限2147483647
for(int i=0;i<=n;i++){//贪心算法遍历汇率Ai
if(stk.empty()){//如果stk为空,则说明还没有进行过一组交易(即换了白银后有换回黄金)
if(s[i]>todays_ai)todays_ai=s[i];//当汇率越高时,换回的马克数量越多,因此当连续上涨时,不进行交易
else{//当忽然跌下时,前一天可以进行交易
stk.push("mark");//此时,可以对栈进行操作,在栈头添加mark,当然也可以用标志变量、队列、向量、双向队列等
sell_day = i-1;//交易日子是前一天,故用i-1存储
todays_ai = s[i];//将这个todays_ai更新,不代表如此就可以不更新
}
}
else{//只有当汇率最低时,再将马克转换成美元最划算
if(s[i]<todays_ai)todays_ai=s[i];//如果连续下降的汇率,那么不交换成美元
else{//否则就代表前一天汇率最低
stk.pop();//栈头的mark删除
if_ai[sell_day] = 1;//这就是为什么要开sell_day变量的原因,以便于存储交换成马克的日期
if_ai[i-1] = 1;//前一天也可以交易(为什么是前一天?见上)
todays_ai = s[i];//不要忘记更新todays_ai今天的汇率
}
}
}
return 0;
}
(改编自交易)
全部评论 1
6
5天前 来自 四川
0
有帮助,赞一个