D - Daydreaming Stockbroker Gym - 101550D
2024-09-06 21:21:53
题目链接:http://codeforces.com/gym/101550/attachments
总的来说就是要:
极大值卖出,极小值买入, 再加上端点时的特判. 还有就是会有连续几天股票价格相同的情况,这里就是判断的时候是严格的大于小于号的功劳了
首先手里肯定是没有股票的, 尝试买入第一天的股票, 如果下一天的股票价格低于当天的股票价格,我们就再卖出当前的所有股票来让下一天再去尝试买入股票.
除了第一天尝试买入股票的时候, 买入股票的时候应该是极小值, 我们可以一次次尝试:(如果当天的价格低于前一天的价格,就说明呈递减状态,就有可能遇到极小值,如果当前不是极小值,我们就再将买入的股票卖出就好了,然后继续尝试). 如果当前的价格高于后一天的价格,就可以卖出.
总之,买入的时候和上一天价格比较判断呈现什么状态,若递减,就可以尝试买入,(不符合条件就再卖出去么~). 卖出的时候和下一天价格比较判断呈现什么状态,若递减就说明可以卖出去,(注意:不能和上一天的价格比较看是否是递增状态就卖,因为卖出后股票就没有了,就需要重新买入,若后一天还是递增就不行了)
实现最精华的就是那个,尝试部分,(若当前尝试买入的不是最优的,就需要重新卖出,这也就是为什么循环里,两个if都要判断一下的原因,而且还是尝试买入为
a[i-1]和a[i]判断状态,卖出时为a[i]和a[i+1]判断状态的原因.)
自己在本子上画上几个图,横轴代表时间,纵轴代表价格, 折线图即可,画出每种状态的简图,自己模拟一下,应该就可以了.
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e4 + ; ll arr[maxn]; int main(){
int n;
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%lld", &arr[i]);
ll all = , now = ;
for(int i = ; i <= n; i++) {
if(i == || arr[i-] > arr[i]) {//尝试买入
ll t = all / arr[i];
now += t;
all -= t*arr[i];
if(now > ) {
all += (now-)*arr[i];
now = ;
}
}
if(i == n || arr[i+] < arr[i]) all += arr[i]*now, now = ;
}
printf("%lld\n", all);
return ;
}
最新文章
- Windows Store App 过渡动画
- MVC4研发中遇到问题【持续总结....】
- 改造一下C# Substring()函数
- 20145120 《Java程序设计》第10周学习总结
- DNS为什么通常都会设置为14.114.114.114
- 在 SUSE 11 sp2 上安装 freeradius
- Sublime text2 常用插件集锦
- Number Sequence--hdu1005
- Angular中Controller之间的信息传递(第二种办法):$emit,$broadcast,$on
- C#多线程的用法4-线程间的协作lock快捷方式
- 探讨 java中 接口和对象的关系
- ●BZOJ 3676 [Apio2014]回文串
- My Stuck in C++
- Oracle AWRDD报告生成和性能分析
- Layui使用table展示数据
- [LeetCode] Rank Scores -- 数据库知识(mysql)
- Spring Boot 2程序不能加载 com.mysql.jdbc.Driver 问题
- java基础 二进制补码
- HashMap Hashtable LinkedHashMap TreeMap
- BETA-2