Smiling & Weeping
----我本想边走边爱,可你一个人就挡住了人山人海
牢骚:其实想明白了也就这么一回事,当时一直想dp,(# ̄~ ̄#)
正解:其实题目说的明明白白,任选一个数,然后他的左右相加,操作之后求出所剩最大的一个数,那么我们直接分odd,even直接求其最大值,就这么简单的没有朋友ε=(´ο`*)))唉,还有一个问题,题目虽然给的是10^9范围,但是还要开long long
Talk is cheap
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int t , n; 5 int main() 6 { 7 scanf("%d",&t); 8 while(t--) 9 { 10 ll ans = 0; 11 scanf("%d",&n); 12 vector<ll> num(n+10); 13 for(int i = 1; i <= n; i++) 14 scanf("%lld",&num[i]); 15 ll an1 = 0 , an2 = 0 , ank = num[1]; 16 bool flag = false; 17 // 特判全部是负数的情况 18 for(int i = 1; i <= n; i++) 19 { 20 if(!flag && num[i] > 0) 21 flag = true; 22 ank = max(ank , num[i]); 23 } 24 if(!flag) 25 { 26 printf("%lld\n",ank); 27 continue; 28 } 29 // 正常至少有一个自然数,分奇、偶讨论 30 for(int i = 1; i <= n; i++) 31 { 32 if((i&1) && num[i] > 0) 33 an1 += num[i]; 34 if((i+1)&1 && num[i] > 0) 35 an2 += num[i]; 36 } 37 ans = max(an1 , an2); 38 printf("%lld\n",ans); 39 } 40 return 0; 41 }
文章到此结束,但我们还将继续前行