题目小结

前言

今晚回来玩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;
	
}

我觉得应该是这个吧,反正很像这两个题
这题水绿罢了 这两个题可以做个对比 说实话 虽然这个橙少了一种情况

posted @ 2025-04-16 19:43  LteShuai  阅读(12)  评论(0)    收藏  举报