我的这一份代码样例和手造数据都对了,但是交上去只有33pts,请dalao们手造几个小数据hack我帮助调试,感激不尽!
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+10;
int n,cnt,maxx;//cnt:冰期总数,maxx:最长冰期长度
int a[N];
int last[N],start[N],end[N];//last[i]表示第i个冰期持续的时间,start[i]表示第i个冰期开始时间,end[i]表示结束
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
a[++n]=0;
a[0]=0,start[0]=1;
for(int i=1;i<=n;++i){
if(a[i]<0){
if(a[i-1]>=0) start[++cnt]=i;//一个冰期开始了!
++last[cnt];
} else if(a[i]>=0 && a[i-1]<0){//一个冰期结束了!
end[cnt]=i;
maxx=max(maxx,end[cnt]-start[cnt]);
}
}
int ans=0;
for(int i=1;i<=cnt;++i)
ans+=min(2*(end[i]-start[i]),start[i]-start[i-1]);
int sum=0;
for(int i=1;i<=cnt;++i){
if(end[i]-start[i]==maxx && min(3*(end[i]-start[i]),start[i]-start[i-1]) > min(2*(end[i]-start[i]),start[i]-start[i-1]))
sum=max(sum,min(3*(end[i]-start[i]),start[i]-start[i-1])-min(2*(end[i]-start[i]),start[i]-start[i-1]));
}
cout<<ans+sum;
return 0;
}