参赛选手未给出题解,本题解并不代表参赛选手
//本题暴力也能过(暴力是参赛选手的原解法),复杂度是 O(n\cdot n) ,具体实现略
使用栈维护一个滑动窗口,右指针每次拓展一格,若扩展后窗口总值大于 k ,则不断弹出左指针直到总值不大于 k ;若此时窗口总值大于历史值且窗口长度 \ge 2 ,记录当前窗口总值和左指针为答案。该解法复杂度为 O(n) 。
参考代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, a[10010], k, ans, ansi, lf, rf, now;
signed main()
{
scanf("%lld%lld", &n, &k);
for (ll i = 1; i <= n; ++i)
{
scanf("%lld", a + i);
}
for (lf = 1, rf = 1; rf <= n; ++rf)
{
now += a[rf];
while (now > k)
{
now -= a[lf++];
}
if (rf - lf >= 1 && now > ans)
{
ans = now, ansi = lf;
}
}
printf("%lld\n%lld", ans, ansi);
return 0;
}
如有错误欢迎指正 >_<
佬
佬