Codeforces Round #672 (Div. 2)C1. Pokémon Army (easy version)【思维+贪心】

    科技2022-09-03  115

    题目

    传送门

    输入 3 3 0 1 3 2 2 0 1 2 7 0 1 2 5 4 3 6 7 输出 3 2 9

    题意:t组测试样例,下面两个数n,m;在下面是n个数,从中按顺序选不超过n个数满足这几个数的先加后减运算值最大.

    思路:我们肯定要加上最大的减去最小的,即为加上一段上升序列中最大值,下降序列中最小值,最后一步操作一定应该为加法,这样保证.值最大

    AC code

    #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<map> #include<sstream> #include<stack> #include<queue> using namespace std; #define ll long long ll n,t,m,a[360000]; void solve() { ll i,s=0,ans=0; for( i=0;i<n;i++) cin>>a[i]; i=1; while(i<n) { for( ;i<n;i++)//上升序列中最大值 if(a[i]-a[i-1]<0) break; ans+=a[i-1]; if(i==n)break;//要跳出去时,如果是加法运算就运算 for(;i<n;i++) if(a[i]-a[i-1]>0)break;//下降序列中最小值 if(i==n)break;//要跳出去时,如果减法运算就跳出去 ans-=a[i-1]; } printf("%lld\n",max(ans,a[0])); } int main() { ios::sync_with_stdio(0); cin>>t; while(t--) { cin>>n>>m; solve();} }
    Processed: 0.008, SQL: 9