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