Good Bye 2021: 2022 is NEAR D
Good Bye 2021: 2022 is NEAR D
这次虽然做了三个(但是C是后来自己看了其他人的代码才发现的问题)
下次一定要double 的判断大小一定要以x-y<=1e-10这种形式,不能直接和int型一样的判断(C我就是错在这儿了)
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,不过我懒的去找了,就用这个吧

浙公网安备 33010602011771号