关闭

POJ 2181 Jumping Cows [贪心]

594人阅读 评论(0) 收藏 举报

题意: 

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


思路:

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;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:296273次
    • 积分:5034
    • 等级:
    • 排名:第5544名
    • 原创:225篇
    • 转载:13篇
    • 译文:1篇
    • 评论:26条
    最新评论