2018.7.21牛客暑期训练 D题

链接:https://www.nowcoder.com/acm/contest/140/D
来源:牛客网

贪心
首先,如果a[i]=a[i+1],则可以删掉第i+1个商店。因为任何在第i+1个商店进行的交易都可以转为在第i个商店
进行,且收益不变。之后,如果a[i]<a[i+1],则离开第i个商店时一定要带上一件商品。如果a[i]>a[i+1],则离开
第i个商店时一定要空着手。这样,第一问的答案就为∑ (n-1,i=1)max(a[i+1]-a[i],0) ,第二问的答案就为长度>1的
极大递增连续段的数量。

分析:这里flag为关键。如果a[i+1]>a[i]连续成立的话,中间是不会有动作的,所以要用flag去判断;如果a[i+1]<a[i]的话,此时应该把商品卖掉利益才会最大,但是如果a[i+1]<a[i[连续成立的话,中间也是不能有动作,所以也用flag判断。最后,如果a[n-1]>a[n]的话,要单独考虑。

#include<iostream>
using namespace std;
#include<cmath>
#include <algorithm>
#include<cstring>
int a[100010];
long long int cost,k,flag;
int main()
{
	int t,n;
	cin>>t;
	while(t--){
		cin>>n;
		cost=k=flag=0;
		for(int i=0;i<n;i++)
			cin>>a[i];
		for(int i=0;i<n-1;i++){
			if(a[i]<a[i+1]&&!flag){    //这里注意两个if里面的flag判断,来保证连续成立时无动作
				cost-=a[i];
				flag=1;
				k++;
			}
			if(a[i]>a[i+1]&&flag){
				cost +=a[i];
				flag=0;
			 	k++;
			}
		}
		if(flag){
			cost+=a[n-1];
			k++;
		} 
		printf("%lld %lld\n",cost,k);
}
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_40725780/article/details/81173645
今日推荐