题目链接: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 + 7; ll arr[maxn]; int main(){ int n; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%lld", &arr[i]); ll all = 100, now = 0; for(int i = 1; i <= n; i++) { if(i == 1 || arr[i-1] > arr[i]) {//尝试买入 ll t = all / arr[i]; now += t; all -= t*arr[i]; if(now > 100000) { all += (now-100000)*arr[i]; now = 100000; } } if(i == n || arr[i+1] < arr[i]) all += arr[i]*now, now = 0; } printf("%lld\n", all); return 0; }