Codeforces Round #636 (Div. 3) 比赛人数12253
[codeforces 1343C] Alternating Subsequence 在连续负数或正数区间内找最大值
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址http://codeforces.com/contest/1343/problem/C
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
C - Alternating Subsequence | GNU C++17 | Accepted | 77 ms | 0 KB |
样例模拟如下
5
1 2 3 -1 -2
2
(1 2 3)内找最大值3
(-1 -2)内找最大值-1
求和3-1=2
4
-1 -2 -1 -3
-1
(-1 -2 -1 -3)内找最大值-1
10
-2 8 3 8 -4 -15 5 -2 -3 1
6
(-2)内找最大值-2
(8 3 8)内找最大值8
(-4 -15)内找最大值-4
(5)内找最大值5
(-2 -3)内找最大值-2
(1)内找最大值1
求和-2+8-4+5-2+1=6
6
1 -1000000000 1 -1000000000 1 -1000000000
-2999999997
(1)内找最大值1
(-1000000000)内找最大值-1000000000
(1)内找最大值1
(-1000000000)内找最大值-1000000000
(1)内找最大值1
(-1000000000)内找最大值-1000000000
求和1-1000000000+1-1000000000+1-1000000000=-2999999997
AC代码如下
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
LL sum;
int main(){
int t,n,i,pre,now;//pre记录连续负数的最大值,或者连续正数的最大值
scanf("%d",&t);
while(t--){
sum=0;
scanf("%d",&n);
scanf("%d",&pre);
for(i=2;i<=n;i++){
scanf("%d",&now);
if(pre<0&&now<0)pre=max(pre,now);
else if(pre>0&&now>0)pre=max(pre,now);
else sum+=pre,pre=now;//负数转正数,或正数转负数
}
sum+=pre;//边界处理,犹豫过,但各种情况考虑后,发现没问题。
printf("%lld\n",sum);
}
return 0;
}