2139: 易水寒
时间限制: 1 Sec 内存限制: 128 MB
提交: 255 解决: 72
[提交] [状态] [讨论版] [命题人:admin]
题目描述
“别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“
最近家里有矿的都去玩一款叫作易水寒的游戏了。聪明的宝儿姐发现易水寒里面的壕真是太多了,他们可以直接用RMB购买游戏币。但是这个游戏币的价格是会浮动的,于是宝儿姐就从某易内部获得了将来n天的游戏币价格,想要以此
来赚取差价。但是呢,宝儿姐又太穷了,不管价格怎么浮动,相对宝儿姐来说她都只能买得起一枚游戏币,请你帮宝儿姐计算一下她只进行一次买入卖出的话最多能赚取的差价是多少吧。(卖出时间应在买入时间之后)
输入
第一行一个测试实例case(case<=5)
第二行一个整数n,代表获得的将来n天的游戏币价格。(n<=1e5)
接下来一行n个整数price,代表n天游戏币的价格。(0<=price<=1000)
输出
Case #x: y, x代表测试实例数,y代表宝儿姐进行一次买入和卖出能赚取的最大差价。
样例输入
1
5
5 5 5 7 5
样例输出
Case #1: 2
思路:
将 w[i] 与前i个元素的最小值做差,求差值的最大数。
思路解析: 用dp记录前i个元素最小值,如果 w[i] 比 dp(此时的dp是上一轮的dp,还未更新) 小则更新 dp
比赛时,求差值只想着用sort求前i个元素的最小值,没想到用动态规划的思想dp,结果超时了%25,写代码时最好不要调用库函数,库函数一般速度较慢,容易超时。比如 max,min,stack,queue能手打就手打,且调用库函数也需要时间,如sort调用多次肯定是要超时的,手打快排才是王道。
代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=1e5+7;
int t,n,w[N];
int main()
{
scanf("%d",&t);
for(int q=1;q<=t;q++)
{
scanf("%d",&n);
memset(w,0,sizeof(w));
for(int i=0;i<n;i++)
scanf("%d",&w[i]);
int dp=w[0];//dp储存前i个元素的最小值,只有一个元素时最小值为它本身,差值为零
int maxx=0;
for(int i=0;i<n;i++)
{
if(w[i]<dp) //w[i]与上一次的dp比较
dp=w[i];//更新dp
if((w[i]-dp)>maxx)//求w[i]与前i个元素最小值dp之差的最大的数
maxx=w[i]-dp;
}
printf("Case #%d: %d\n",q,maxx);
//这个循环从i=0开始,循环的第一次时maxx为0是为了价格是递减的情况,此时最大值为0
}
return 0;
}