1945 : 卡贩子Carol

题目描述

来自F星球的Carol是一个不折不扣的“正版游戏受害者”,在黑色星期五的疯狂购买后,钱包渐空的Carol突然发现TA所使用的游戏交易平台上有个值得留意的地方————集换式卡牌。
集换式卡牌是可以买卖的,卖家和买家都来自社区。由于社区的每个人都可以随时发出新的购买请求,一张热门卡牌的报价甚至每个小时都是不一样的。
1945 : 卡贩子Carol
F星球的居民每个人都有一些特殊技能,而Carol的技能则是预知未来12小时内要发生的所有“静态事件”,这个“静态事件”当然也包含了某张集换式卡牌12小时内的买家最高报价。而Carol要做的就是规划好这12小时,在低价时买入,高价时卖出,以赚差价填回自己的钱包。

Carol现在手头并没有卡,所以他只能通过买入来获得卡。为了展现自己不滥用特殊技能,Carol决定每次购买只买入一张卡,卖出则不限制数量。但是由于智商有限,Carol并不知道他应该在什么时候买入什么时候卖出,于是他请求你来帮忙。而得知他在滥用特殊技能的你自然不打算帮他,于是你打算只告诉他最多能赚多少。那么请问他最多可以赚多少钱?

输入
多组实例测试,输入的第一行给定一个整数T,表示样例数量,接下来每行12个整数c1,c2...c12(<= c1,c2,c3....<=),表示十二小时内某张集换式卡牌的报价。 输出
对于每组样例,均输出一行,表示该12小时内能够获得的最大收益。 样例输入 样例输出 47

提示

注意:每张卡只能卖一次,并且每个时间点可以选择买或者不买,卖出只能在买后的时间

思路:需要找到在一段区间中最大的价格,

代码:

#include<stdio.h>
#include <iostream>
#include<algorithm>
using namespace std;
int a[],b[];//b数组存当前所能卖的最大的价格
int main()
{
int T,i;
scanf("%d",&T);
while(T--)
{
for(i=;i<=;i++)
scanf("%d",&a[i]);
b[]=;
for(i=;i>=;i--)
{
if(a[i]>b[i+])
b[i]=a[i];
else
b[i]=b[i+];
}
int d=,sum=,num=;
for(i=;i<=;i++)
{
if(a[i]<b[i])//思考等于
{
d++;
num+=a[i];
}
else
{
sum+=d*b[i];
sum-=num;
num=;
d=;
}
}
printf("%d\n",sum);
}
return ;
}
上一篇:使用proguard混淆java web项目代码


下一篇:Java面试题-多线程