zoukankan      html  css  js  c++  java
  • USACO 2009 Feb 股票市场 Stock Market

    USACO 2009 Feb 股票市场 Stock Market

    Description

    尽管奶牛们天生谨慎,她们仍然在住房抵押信贷市场中大受打击,现在她们准备在股市 上碰碰运气。贝西开挂了,她知道S只股票在今后D天内的价格。

    假设她一开始有M元钱,怎么操作才能在D天后赚到最多的钱?股票在市场上的供应量 可以看成是无限的,但买卖股票必须以整数为最小交易单位。

    举一个牛市的例子。假设贝西有10元本金,股票价格如下:

    股票 今天的单价 明天的单价 后天的单价

    A 10 15 15

    B 13 11 20

    最赚钱的做法是:今天买入A股1张,到明天把它卖掉并且买入B股1张,然后在后 天卖掉B股,此时贝西手上会有24元。

    Input Format

    第一行:三个用空格分开的整数:S,D和M,2≤S≤50,2≤D≤10,1≤M≤200000

    第二行到第S+1行:第s+1行表示第s种股票在第1 天到第D天的售价,1≤售价≤1000

    Output Format

    第一行:D天后能拥有的最多钱数,保证这个数字不超过500000

    Sample Input

    2 3 10
    10 15 15
    13 11 20

    Sample Output

    24

    Solution

    对于每种股票,如果是当天买入,次日卖出的话,可以用完全背包解决:

    把股票当天的价格当作体积,次日的价格减当天的价格为价值。
    如果不是当天买入次日卖出,可以看作中间的日期卖出后买入,然后又回到当天买入次日卖出的情况。

    例如第1天买入,第3天卖出可以看作:第1天买入,第2天卖出,第二天买入,第三天卖出。

    Code

    #include<cstdio>
    
    int s,d,m,p,f[5000001],c[11][51];
    
    int main(){
    	scanf("%d%d%d",&s,&d,&m);
    	for (int i=1;i<=s;++i)
    	  for (int j=1;j<=d;++j)
    		scanf("%d",&c[j][i]);
    	for (int i=1;i<d;++i){
    		f[0]=m;
    		for (int k=1;k<=s;++k)
    		 for (int j=c[i][k];j<=f[0];++j){
    			if (f[j-c[i][k]]-c[i][k]+c[i+1][k]>f[j])
    			 f[j]=f[j-c[i][k]]-c[i][k]+c[i+1][k];
    			if (f[j]>=m) m=f[j];
    		 }
    	}
    	printf("%d",m);
    }
    
  • 相关阅读:
    直方图有两种类别,等频直方图与等高直方图。
    yangtingkun常数复合索引应用案例
    Using Oracle 10g Tuning Utilities
    Oracle统计信息的备份还原
    ITPUB:分区表,每次查询取出1%的记录,为什么没有走索引?
    ITPUB: Newkid的两个NULL与索引的小技巧
    ORACLE全文检索文件路径版
    分区表、分区索引和全局索引部分总结
    Oracle 10g中的SQL跟踪新方法
    gsoap bug 小记
  • 原文地址:https://www.cnblogs.com/hyheng/p/7773655.html
Copyright © 2011-2022 走看看