高精度,贪心

来源:互联网 发布:linux安装hadoop2.6 编辑:程序博客网 时间:2024/06/01 21:14

题意

买卖GTX1920,已知未来一段时间每块GTX1920的价格,问买卖后最大的收益

  • 每次买入都尽可能多买,每次卖都全卖
  • 在每个局部价格山谷都买入,然后在接下来的第一个局部价格山顶卖出
  • 最后的资金会很大,超过long long的范围,但是中间结果不能取模,不然无法计算出下次购买GTX1920的数量,所以使用BigInteger来计算

BigInteger用法总结

  • 使用前要 import java.math.BigInteger;
  • 不能直接给BigInteger赋值,使用
    BigInteger mod=BigInteger.valueOf(1000000007);
  • 运算规则:(a和b都必须为BigInteger类型)
    1. 加(a+b):a.add(b);
    2. 减(a-b):a.subtract(b);
    3. 乘(a*b):a.multiply(b);
    4. 除(a/b):a.divide(b);
    5. 取模(a%b):a.mod(b);
    6. 比较:a.compareTo(b)//a<b,-1 a==b,0 a>b,1
import java.util.Scanner;import java.math.BigInteger;public class Main {    public static void main(String[] args) {        Scanner cin=new Scanner(System.in);        int T;        int n,m;        int[] c = new int[2005];        T=cin.nextInt();        BigInteger ans,mod=BigInteger.valueOf(1000000007);        for(int xx=1;xx<=T;++xx){            n=cin.nextInt();            m=cin.nextInt();            ans=BigInteger.valueOf(m);            for(int j=0;j<n;++j) {                c[j]=cin.nextInt();            }            int i,j,k;            for(i=0;i<n;) {                j=i;                while(j<n-1&&c[j+1]<=c[j])++j;                if(j==n-1)break;                k=j;                while(k<n-1&&c[k+1]>c[k])++k;                BigInteger res=ans.mod(BigInteger.valueOf(c[j]));                BigInteger buy=ans.divide(BigInteger.valueOf(c[j]));                buy=buy.multiply(BigInteger.valueOf(c[k]));                ans=res.add(buy);                i=k+1;            }            System.out.println("Case #"+xx+": "+ans.mod(mod));        }    }}
原创粉丝点击