题目小结
前言
今晚回来玩4399还有看ok哥了 不然还能再切道d题,可能由于端午放假 心态放松了
选区的题目 就是感觉想选的 不想选的不选了
开始
第一个题


这题我是用一个二分前缀和做的
char ch;
int a[range];
int sum[range];
bool check(int l,int mid)
{
if(sum[mid]-sum[l]>0)
{
return 1;
}
else return 0;
}
void solve(int t)
{
cin>>n;
cin>>ch;
string s;
cin>>s;
if(ch=='g')
{
cout<<0<<endl;
return ;
}
s=s+s;
int len=s.size();
s=' '+s;
for(int i=1;i<=len;i++)
{
if(s[i]=='g')
{
a[i]=1;
}
else a[i]=0;
}
for(int i=1;i<=len;i++){
sum[i]=sum[i-1]+a[i];
}
int ans=1e9;
int trueans=0;
for(int i=1;i<=len;i++)
{
ans=1e9;
if(s[i]==ch)
{
int l=i;
int r=i+n-1;
while(l<=r)
{
int mid=l+r>>1;
if(check(i,mid))
{
ans=min(ans,mid-i);
r=mid-1;
}
else l=mid+1;
}
if(ans!=1e9)trueans=max(trueans,ans);
}
}
for(int i=1;i<=len+1e5;i++)
{
sum[i]=0;
a[i]=0;
}
cout<<trueans<<endl;
return ;
实际上 用队列会更简单的
只需要不断入队 遇到green拿队头进行比较即可,然后清空队列 因为此时对内元素无用了,我的方法复杂了


第二个题

题目
这个题目
首先我没做出来
就是不知道联想gcd 草
以后我优先想gcd 虽然这句哈不知道说了多少次了
这篇题解已经写了
这里
第三个题
不好说什么 反正总感觉做过,真的感觉做过呢
首先对于任何一点,他的作用可能有以下两个
做右边
做左边
于是 做右边 我们就得让他,卧槽,卧槽,我绝对做过,死去的记忆开始攻击我了 ,我去找找。
应该是这个

int dp[range];
void solve()
{
cin>>n>>m;
int maxn=0;
for(int i=1;i<=m;i++)
{
cin>>a[i];
maxn=max(a[i],maxn);
}
for(int i=1;i<=n+maxn;i++)dp[i]=-1e9;
sort(a+1,a+1+m);
int ans=-1e9;
dp[0]=0;
for(int i=0;i<=n-1;i++)cin>>b[i];
for(int i=a[1];i<n+maxn;i++)
{
for(int j=1;j<=m;j++)
{
if(i-a[j]<0)continue;
if(i-a[j]>=n)continue;
dp[i]=max(dp[i],dp[i-a[j]]+b[i-a[j]]);
}
}
for(int i=n;i<n+maxn;i++)ans=max(ans,dp[i]);
cout<<ans;
}
我觉得应该是这个吧,反正很像这两个题
这题水绿罢了 这两个题可以做个对比 说实话 虽然这个橙少了一种情况

浙公网安备 33010602011771号