贪心算法

来源:互联网 发布:魔力鸭淘宝旗舰店 编辑:程序博客网 时间:2024/06/06 15:48

题意: 

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


思路:

O(n)贪心。

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

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

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


[cpp] view plaincopy
  1. #include<iostream>  
  2. #include<stdio.h>  
  3. #include<string.h>  
  4. #include<algorithm>  
  5. #define Max(a,b) ((a)>(b)?(a):(b))  
  6. #define Min(a,b) ((a)<(b)?(a):(b))  
  7. using namespace std;  
  8. const int N=150005;  
  9. const int inf=(1<<30);  
  10. int n,m;  
  11. int a[N];  
  12. void solve()  
  13. {  
  14.     int flag=0;  
  15.     int mx=0,mn=inf;  
  16.     int i=1,ans=0;  
  17.     while(i<=n)  
  18.     {  
  19.         if(!flag)  
  20.         {  
  21.             if(a[i]>mx)  
  22.             {  
  23.                 mx=a[i];  
  24.             }  
  25.             else  
  26.             {  
  27.                 flag=1;  
  28.             }  
  29.         }  
  30.         if(flag)  
  31.         {  
  32.             if(a[i]<mn)  
  33.             {  
  34.                 mn=a[i];  
  35.             }  
  36.             else  
  37.             {  
  38.                 flag=0;  
  39.                 ans+=(mx-mn);  
  40.                 mx=0;  
  41.                 mn=inf;  
  42.                 continue;  
  43.             }  
  44.         }  
  45.         i++;  
  46.     }  
  47.     if(flag)  
  48.       ans+=mx;  
  49.     printf("%d\n",ans);  
  50. }  
  51. int main()  
  52. {  
  53.     scanf("%d",&n);  
  54.     for(int i=1;i<=n;i++)  
  55.     {  
  56.         scanf("%d",a+i);  
  57.     }  
  58.     a[++n]=0;  
  59.     solve();  
  60.     return 0;  
  61. }  

0 0
原创粉丝点击