这道题。一开始以为,是到动态规划,结果瞎规划了半天。然后我们队的暴力之神说,这不就是个贪心问题么。结果瞎搞搞就搞对了。我还在苦苦的帮他们证明的时候,就AC了,嗯,不说了。给大家看看题意吧。
题意:一开始一个人有无限多的钱。然后有n个商店,然后你将会顺序的访问这n个商店。到每个商店,你可以执行如下两种操作。买物品,卖物品,或直接不操作走。买物品有前提,就是你手里没有物品时,你才能买,并且只能买一个。所有的商店均只有一个物品,但是买和卖的价格不同。给你每个商店的买卖的价格。问走到最后能最大获利是多少,并且操作数目最小。
题解:嗯,我们其实很容易发现,价格会成为一个线段,有高有低的,我们需要在极小值点买入,极大值点卖就可以了。证明过程我用一个显然来代替。因为这是直观能看出来的。
没有坑点的题。
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100010],n;
int main(){
ll t;
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
for(ll i = 1 ; i <= n ;i ++)
scanf("%lld",&a[i]);
ll ok = 0,now,ans = 0,cnt = 0;
for(ll i = 2 ; i <= n ; i ++){
if((a[i-1] < a[i]) && ok == 0){
ok = 1;
now = a[i-1];
}
else if((a[i-1] > a[i]) && ok){
ans += a[i-1] - now;
ok = 0;
cnt += 2;
}
}
if(ok){
ans += a[n] - now;
cnt += 2;
}
printf("%lld %lld\n",ans,cnt);
}
return 0;
}