1->n,计算最大字段和maxa[i] = max{maxa[i-1]+a[i], a[i]},对于maxa[i] > x的情况,进行一次操作cnt++,令maxa[i] = -INF。
这种做法可以保证前面遍历过的最大字段和<=x,同时尽量让后面的最大字段和变小,使得操作次数最少。
最终的答案需要考虑没有操作cnt==0时,有无maxa[i] == x,有输出0;没有输出1。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
ll n, x;
ll a[N], maxa[N];
void solve()
{
ll cnt = 0;
bool flag = false;
cin>>n>>x;
maxa[0] = -1e18;
for (int i=1; i<=n; ++i)
{
cin>>a[i];
}
for (int i=1; i<=n; ++i)
{
maxa[i] = max(a[i], maxa[i-1]+a[i]);
if (maxa[i] == x) flag = true;
if (maxa[i]>x)
{
cnt++;
maxa[i] = -1e18;
}
}
if (cnt == 0 && flag)
cout<<"0\n";
else
cout<<max(1ll, cnt)<<'\n';
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t=1;
cin>>t;
while (t--)
{
solve();
}
return 0;
}



京公网安备 11010502036488号