您的位置:首页 > 其它

高精度,贪心 - FZU 2281 (BigInteger)

2017-08-22 11:40 295 查看

题意

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

每次买入都尽可能多买,每次卖都全卖

在每个局部价格山谷都买入,然后在接下来的第一个局部价格山顶卖出

最后的资金会很大,超过long long的范围,但是中间结果不能取模,不然无法计算出下次购买GTX1920的数量,所以使用BigInteger来计算

BigInteger用法总结

使用前要
import java.math.BigInteger;


不能直接给BigInteger赋值,使用
BigInteger mod=BigInteger.valueOf(1000000007);


运算规则:(a和b都必须为BigInteger类型)

加(a+b):
a.add(b);


减(a-b):
a.subtract(b);


乘(a*b):
a.multiply(b);


除(a/b):
a.divide(b);


取模(a%b):
a.mod(b);


比较:
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));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: