The advice to "buy low" is half the formula to success in the stock market. But to be considered a great investor you must also follow this problems' advice:
That is, each time you buy a stock, you must purchase more at a lower price than the previous time you bought it. The more times you buy at a lower price than before, the better! Your goal is to see how many times you can continue purchasing at ever lower prices.
You will be given the daily selling prices of a stock over a period of time. You can choose to buy stock on any of the days. Each time you choose to buy, the price must be lower than the previous time you bought stock. Write a program which identifies which days you should buy stock in order to maximize the number of times you buy.
By way of example, suppose on successive days stock is selling like this:
Day 1 2 3 4 5 6 7 8 9 10 11 12 Price 68 69 54 64 68 64 70 67 78 62 98 87
In the example above, the best investor (by this problem, anyway) can buy at most four times if they purchase at a lower price each time. One four day sequence (there might be others) of acceptable buys is:
Day 2 5 6 10 Price 69 68 64 62
PROGRAM NAME: buylow
INPUT FORMAT
| Line 1: | N (1 <= N <= 5000), the number of days for which stock prices are available. |
| Line 2..etc: | A series of N positive space-separated integers (which may require more than one line of data) that tell the price for that day. The integers will fit into 32 bits quite nicely. |
SAMPLE INPUT (file buylow.in)
12 68 69 54 64 68 64 70 67 78 62 98 87
OUTPUT FORMAT
Two integers on a single line:
- the length of the longest sequence of decreasing prices
- the number of sequences that have this length
In counting the number of solutions, two potential solutions are considered the same (and would only count as one solution) if they repeat the same string of decreasing prices, that is, if they "look the same" when the successive prices are compared. Thus, two different sequence of "buy" days could produce the same string of decreasing prices and be counted as only a single solution.
SAMPLE OUTPUT (file buylow.out)
4 2
题目:http://ace.delos.com/usacoprob2?a=lMJaOCLPWMP&S=buylow
题意:最长递减子序列+不同的子序列个数
分析:经典的题目,不过我记得中文版本貌似不用大数的,哎,wa了一次
代码:
/*
ID: 15114582
PROG: buylow
LANG: C++
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int mm=5555;
int a[mm],f[mm],g[mm][111];
int i,j,k,n,ans;
void add(int a,int b)
{
int i,k=0;
for(i=1;i<=g[b][0];++i)
{
g[a][i]+=g[b][i]+k;
k=g[a][i]/10;
g[a][i]%=10;
}
while(k)
{
g[a][i]+=k;
k=g[a][i]/10;
g[a][i++]%=10;
}
g[a][0]=max(i-1,g[a][0]);
}
int main()
{
freopen("buylow.in","r",stdin);
freopen("buylow.out","w",stdout);
while(~scanf("%d",&n))
{
for(i=1;i<=n;++i)
scanf("%d",&a[i]);
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
a[0]=1e9;
for(i=1;i<=n;++i)
for(j=0;j<i;++j)
if(a[j]>a[i])
f[i]=max(f[i],f[j]+1);
ans=0;
for(i=1;i<=n;++i)
ans=max(ans,f[i]);
for(i=1;i<=n;++i)
if(f[i]==ans)g[i][0]=g[i][1]=1;
for(i=n;i>0;--i)
{
j=i-1;
while(j>=0)
{
if(f[j]==f[i]-1&&a[j]>a[i])add(j,i);
if(a[j--]==a[i])break;
}
}
printf("%d ",ans);
for(i=g[0][0];i>0;--i)
printf("%d",g[0][i]);
puts("");
}
return 0;
}
本文介绍了一种股票市场的投资策略,即“低价买入,更低价加仓”。该策略要求投资者每次购入股票的价格都低于上次购买价格,以实现长期利益最大化。文章提供了一个程序示例,用于确定最佳购买时机。
1654

被折叠的 条评论
为什么被折叠?



