#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define N 500005
int t,n,ans,vis[N];
long long num[N],sum;
int main()
{
int cas=0;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
scanf("%d",&n);
ans=n;
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&num[i]);
}
sum=num[n];
if(sum<=0)
{
ans--;
vis[n]=1;
}
for(int i=n-1;i>=1;i--)
{
if(sum<=0)
{
sum+=num[i];
if(sum<=0)
{
ans--;
vis[i]=1;
}
}
else
{
if(num[i]<=0)
{
sum=num[i];
ans--;
vis[i]=1;
}
}
}
if(sum<=0)
{
for(int i=n;i>=1;i--)
{
sum+=num[i];
if(sum<=0&&!vis[i])
{
ans--;
vis[i]=1;
}
else if(sum>0)
break;
}
}
printf("Case %d: %d\n",++cas,ans);
}
return 0;
}
首先,这个代码也没过
实在不懂
求大神指教
开始的开始
我傻乎乎的循环套循环
结果当然TLD
然后尝试
从后往前遍历
sum<=0 尝试+前面数组的数 是不是仍然不满足条件 ans--
还有如果作为开头就<=0 ans--
还有如果遍历到开头 还是<=0 再重新遍历(因为可以循环) 所以前面要标记
下面是过了的AC代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include<algorithm>
using namespace std;
const int N = 1e6;
double a[N];
int ca;
bool vis[N];
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
for (int i = 0; i<n; ++i) {
scanf("%lf", &a[i]);
}
double t = 0;
memset(vis, 0, sizeof(vis));
bool flag = true;
int sum = n;
for (int i = n - 1; i >= 0; --i) {
if (a[i] <= 0 && flag) flag = false;
if (!flag) {
t += a[i];
if (t <= 0) vis[i] = true, sum--;
else flag = true, t = 0;
}
}
if (t <= 0) {
for (int i = n - 1; i >= 0; --i) {
t += a[i];
if (t <= 0 && !vis[i]) {
vis[i] = true;
sum--;
}
else if (t > 0) break;
}
}
printf("Case %d: %d\n", ++ca, sum);
}
return 0;
}