栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C1. Pokémon Army (easy version)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C1. Pokémon Army (easy version)

 意思就是,给你一个序列,找出按顺序先减后加之后能得到的最大值,俩种方法,一种贪心,一种dp。(我开始的思路是找波峰的值加一下,波谷的值减一下,如果不凑巧只有递增,或者只有递减,再加一个处理,结果动态规划更简单(捂脸))

#include 
#define fep(i,a,b) for(ll i=a;i<=b;i++)
#define frp(i,a,b) for(ll i=a;i>=b;i--)
typedef long long ll;
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn=3e5+1;
ll a[maxn],b[maxn];

void solve(){
   ll n,q,mx=0,sum=0,pos=0,pos2=0,mi=INF,k=0;
   memset(a,0,sizeof(a));
   cin>>n>>q;
   a[0]=0;
   fep(i,1,n){
        cin>>a[i];
        k=max(k,a[i]);
        if(a[i]>a[i-1]){
           // printf("mi:%d mx=%d sum=%d up!n",mi,mx,sum);
            if(pos)
                sum-=mi,pos=0;
            mx=max(mx,a[i]);
            pos2=1,mi=INF;
        }else{
            if(pos2)
                sum+=mx,pos2=0;
            //printf("mi:%d mx=%d sum=%d down.....n",mi,mx,sum);
            mi=min(mi,a[i]);
            pos=1,mx=0;
        }
   }
   if(!sum||mx==a[n])
    sum+=mx;
   cout<>t;
    while(t--){
        solve();
    }
}
#include 
#define fep(i,a,b) for(ll i=a;i<=b;i++)
#define frp(i,a,b) for(ll i=a;i>=b;i--)
typedef long long ll;
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn=3e5+1;
ll a[maxn],b[maxn],dp[maxn][2];

void solve(){
   ll n,q,k=0;
   memset(dp,0,sizeof(dp));
   cin>>n>>q;
   a[0]=0;
   fep(i,1,n){
        cin>>a[i];
        k=max(k,a[i]);
        dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i]);
        dp[i][1]=max(dp[i-1][1],dp[i-1][0]-a[i]);
   }
    cout<>t;
    while(t--){
        solve();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1010334.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号