2018暑期牛客网多校第二场签到题---贪心

这道题。一开始以为,是到动态规划,结果瞎规划了半天。然后我们队的暴力之神说,这不就是个贪心问题么。结果瞎搞搞就搞对了。我还在苦苦的帮他们证明的时候,就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;
}

猜你喜欢

转载自blog.csdn.net/pk__pk/article/details/81163251