每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

Good Bye 2021: 2022 is NEAR D

Good Bye 2021: 2022 is NEAR D

这次虽然做了三个(但是C是后来自己看了其他人的代码才发现的问题)

下次一定要double 的判断大小一定要以x-y<=1e-10这种形式,不能直接和int型一样的判断(C我就是错在这儿了)

D

D

这个我又看错题意了,这个题的大意是我们需要很多段,每一段的任意l到r的和都要大于等于(r-l+1)x,最后求出这些段的总和最大的(我理解成了只要一段,求最长的一段)

然后这一个我们是找不可以的,然后n-ans

有哪几种是不可能的呢

1.如果选择两个ai和ai+1是小于2*x,那么这个i+1一定是不可以存在那些子段里面的(因为要任意l,r都要满足和大于等于(r-l+1)x)那我们ans++,跳过i+1

2,如果ai+ai+1+ai+2小于3*x,那么ai+2一定是不可以存放在子段里,ans++,跳过i+2(到了第二个判断,一定是前一个没有满足的,那么ai+ai+1一定是大于2x的)

我们不需要一定要a[i]>=x是因为题目要求l和r不可以相等

具体实现看代码

#include <iostream>
using namespace std;
const int maxn=50000+10;
int t,n,x;
int a[maxn];
void solve()
{
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    cin>>x;
    int ans=0;
    for (int i=1;i<=n;i++)
    {
        if (i+1<=n&&(a[i]+a[i+1])<2*x)
        {
            i++;
            ans++;
        }
        else if (i+2<=n&&(a[i]+a[i+1]+a[i+2]<3*x))
        {
            i+=2;
            ans++;
        }
    }
    ans=n-ans;
    cout<<ans<<'\n';
    return ;
}
int main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

这个还有dp,不过我懒的去找了,就用这个吧

posted @ 2023-01-05 14:19  righting  阅读(43)  评论(0)    收藏  举报