Aszxqw

新博客地址 http://yanyiwu.com

POJ 2181 Jumping Cows [贪心]

题意: 

给定一个数字串,按奇偶顺序挑选几个数字,+奇选的数字-偶选的数字,问怎样顺序挑选使最后的和最大。


思路:

O(n)贪心。

本质上其实是在对这个串进行分割,分割成若干段,每个段里面有一个最大值,一个最小值,且最大值在最小值前面。

O(N)去遍历,先找出最大值,然后找出最小值,就算完成一个子段。

至于最后的子段肯定是只有最大值,所以只需在读取的串最后面加一个数字0即可。


#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=150005;
const int inf=(1<<30);
int n,m;
int a[N];
void solve()
{
	int flag=0;
	int mx=0,mn=inf;
	int i=1,ans=0;
	while(i<=n)
	{
		if(!flag)
		{
			if(a[i]>mx)
			{
				mx=a[i];
			}
			else
			{
				flag=1;
			}
		}
		if(flag)
		{
			if(a[i]<mn)
			{
				mn=a[i];
			}
			else
			{
				flag=0;
				ans+=(mx-mn);
				mx=0;
				mn=inf;
				continue;
			}
		}
		i++;
	}
	if(flag)
	  ans+=mx;
	printf("%d\n",ans);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",a+i);
	}
	a[++n]=0;
	solve();
	return 0;
}


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭