题意:
给定一个数字串,按奇偶顺序挑选几个数字,+奇选的数字-偶选的数字,问怎样顺序挑选使最后的和最大。
思路:
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;
}