Educational Codeforces Round 94 (Rated for Div. 2) A~D

本文解析了四道编程挑战题目,包括字符串相似性、RPG主角装备购买策略、二进制字符串重构及Z字形排列计数。通过示例代码展示了如何运用贪心算法、枚举策略解决复杂问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

A - String Similarity

B - RPG Protagonist

C - Binary String Reconstruction

D - Zigzags


A - String Similarity

思维,只需要对每个字串依次提取一个字符组成目标字符即可;

#include <bits/stdc++.h> 
using namespace std;
typedef long long ll;
int main()
{
	int t;cin >>t;
	while(t--)
	{
		int n;
		cin >>n;
		n=n*2-1;
		string s;
		cin >>s;
		for(int i=0;i<n;i++) if(i%2==0) cout <<s[i];
		cout <<endl;
	}
}

B - RPG Protagonist

 B放了个1700的题.......

第一眼以为是个背包,一看数据gg;正确思想是贪心+枚举:

首先肯定是先买s和w中最小的 (假设是s) ;枚举p能买s的个数,对应每一个个数状态计算先买s后剩下的钱买w;之后,f也同样先买s,剩下的钱买w

#include <bits/stdc++.h> 
using namespace std;
typedef long long ll;
int ans,p,f,cnts,cntw,s,w;
void get()
{
	int x=min(p/s,cnts);
	//cout <<"x"<<" "<<x<<endl;
//	int y=min((p-x*s)/w,cntw);
//	int z=min(p/(s+w)*2+(p-(p/(s+w)*(s+w)))/s,min(cnts,cntw)*2+)
//	//cout <<x<<" "<<y<<endl;
//	if(x+y>=min(p/(s+w)*2,min(cnts,cntw)*2)+) ans+=x+y,cnts-=x,cntw-=y;
//	else if(cnts>=p/(s+w)) cnts-=p/(s+w),cntw-=p/(s+w),ans+=p/(s+w)*2;
//	//cout <<ans<<" ans"<<endl;
	
	for(int i=0;i<=x;i++)
	{	
		int cntss=cnts,cntww=cntw;
		int sum=0;
		sum+=i+min((p-i*s)/w,cntww);
		cntss-=i,cntww-=min((p-i*s)/w,cntw);
		//cout <<cntss<<" "<<cntww<<endl;
		sum+=min(cntss,f/s)+min((f-min(cntss,f/s)*s)/w,cntww);
		ans=max(sum,ans);
	}
	
}
int main()
{
	int t;cin >>t;
	while(t--)
	{
		ans=-0x3f3f3f3f;
		cin >>p>>f>>cnts>>cntw>>s>>w;
		if(s>w) swap(s,w),swap(cnts,cntw);
		get();
		cout <<ans<<endl;
	}
}

C - Binary String Reconstruction

目前还在WA;但是思路感觉没问题...

思路:先初始化w数组都为1,然后根据s中0的位置,更新w中0的位置;

之后,根据w数组求出s数组,看是否和原始s数组相同即可;

wa代码:原因是没处理  i+x>n&&i-x<=0 的情况,此时si=0

#include <bits/stdc++.h> 
using namespace std;
typedef long long ll;
char s[100005],w[100005],temp[100005];
int main()
{
	int t;
	cin >>t;
	while(t--)
	{
		int f=1;
		cin >>s+1;
		int x;cin >>x;
		int n=strlen(s+1);
		for(int i=1;i<=n;i++) w[i]='1',temp[i]='1';
		for(int i=1;i<=n;i++)
		{
			if(i<=x&&s[i]=='0') w[i+x]='0';
			else if(i+x>n&&s[i]=='0') w[i-x]='0';
			else if(s[i]=='0') w[i+x]='0',w[i-x]='0';
		}
//		for(int i=1;i<=n;i++) cout <<w[i];
//		cout<<endl;
		for(int i=1;i<=n;i++)
		{
			if(i<=x) temp[i]=w[i+x];
			else if(i+x>n) temp[i]=w[i-x];
			else temp[i]=(w[i+x]-'0')|(w[i-x]-'0')+'0';
		}
//		for(int i=1;i<=n;i++) cout <<temp[i];
//		cout<<endl;
		for(int i=1;i<=n;i++)
		{
			if(s[i]!= temp[i]) {f=0;break;}
		}
		if(f) {for(int i=1;i<=n;i++) cout <<w[i];cout <<endl;}
		else puts("-1");
		
	}
}

AC代码:

#include <bits/stdc++.h> 
using namespace std;
typedef long long ll;
char s[100005],w[100005],temp[100005];
int main()
{
	int t;
	cin >>t;
	while(t--)
	{
		int f=1;
		cin >>s+1;
		int x;cin >>x;
		int n=strlen(s+1);
		for(int i=1;i<=n;i++) w[i]='1',temp[i]='0';
		for(int i=1;i<=n;i++)
		{
			if(i+x>n&&i-x<=0) continue;
			if(i<=x&&s[i]=='0') w[i+x]='0';
			else if(i+x>n&&s[i]=='0') w[i-x]='0';
			else if(s[i]=='0') w[i+x]='0',w[i-x]='0';
		}
//		for(int i=1;i<=n;i++) cout <<w[i];
//		cout<<endl;
		for(int i=1;i<=n;i++)
		{
			if(i+x>n&&i-x<=0) continue;
			if(i<=x) temp[i]=w[i+x];
			else if(i+x>n) temp[i]=w[i-x];
			else temp[i]=((w[i+x]-'0')|(w[i-x]-'0'))+'0';
		}
//		for(int i=1;i<=n;i++) cout <<temp[i];
//		cout<<endl;
		for(int i=1;i<=n;i++)
		{
			if(s[i]!= temp[i]) {f=0;break;}
		}
		if(f) {for(int i=1;i<=n;i++) cout <<w[i];cout <<endl;}
		else puts("-1");
		
	}
}

 

D - Zigzags

思路:枚举  j  和  k  的位置,那么i只能在(1,j)中选择, l只能在 (k,n) 中选择;然后统计每个区间中每个数字出现次数的前缀和;利用乘法原理求解即可;

#include <bits/stdc++.h> 
using namespace std;
typedef long long ll;
ll a[3005],sum[3005][3005];
int main()
{
	int t;
	cin >>t;
	while(t--)
	{
		int n;
		cin >>n;
		for(int i=1;i<=n;i++)
		{
			cin >>a[i];
			for(int j=1;j<=n;j++) sum[i][j]=sum[i-1][j];
			sum[i][a[i]]++;
		}
		ll ans=0;
		for(int j=2;j<=n-2;j++)
		{
			for(int k=j+1;k<=n-1;k++)
			{
				ans+=(sum[j-1][a[k]])*(sum[n][a[j]]-sum[k][a[j]]);
			}
		}
		cout <<ans<<endl;
	}
}

 

"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值