Educational Codeforces Round 113 (Rated for Div. 2)

Problem - A - Codeforces

给你一个只包含A和B的字符串,需要找到任何一个连续字串,使得其中的A和B相同。

暴力找即可,而且只要求其中一个,也不要求最长。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{	
	ll x=0,w=1; char ch=0;ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*w;
}
inline void print(ll x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)print(x/10);
	putchar(x%10+48);
}		
int n,t;
string str;
void solve()
{
	cin>>n;
	cin>>str;
	int len=str.length();
	for(int i=0;i<len;i++)
	{
		int a=0,b=0;
		for(int j=i;j<len;j++)
		{
			if(str[j]=='a')a++;
			if(str[j]=='b')b++;
			if(a==b&&a!=0)
			{
				cout<<i+1<<' '<<j+1<<endl;
				return ;
			}
		}
	}
	cout<<-1<<' '<<-1<<endl;
}
int main()
{
	ios
	cin>>t;
	while(t--)solve();
	return 0;
}

Problem - B - Codeforces

有N个人,每个人都有一种要求

1.不输

2.至少赢一把。

求胜负图。其中+为赢,-为输,X为自己遇到自己,=为平局

统计2要求的人数,我们知道,不可能只有一个人赢而且其他人不输,推理一下也可以知道两个人也不能做到每个人赢一局(因为只有一场比赛不可能两个人都赢)

那么有三个以上要赢的人呢?三个人想要赢,就可以接受自己输了,只需要让每个人都赢一局而且输一局就行了。所以让每个2选项的人都赢自己后面的人,也被前面的人赢。让每个1选项的人都平局,即可。

思路倒是一下就想出来了,代码bug找了半天,发现输赢没清空。这卡了好久,烦死了。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{	
	ll x=0,w=1; char ch=0;ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*w;
}
inline void print(ll x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)print(x/10);
	putchar(x%10+48);
}		
const int N=1e2+5;
int n,t,cnty,cnte,e[N];
char num[N];
char f[55][55];
void solve()
{
	int tope=0;
	cin>>n;
	cnte=0,cnty=0;
	memset(e,0,sizeof(e));
	memset(f,0,sizeof(f));
	cin>>num+1;
	rep(i,1,n)
	{
		if(num[i]!=0)
		num[i]=num[i]-'0';
	}
	rep(i,1,n)
	{
		if(num[i]==1)cnty++;
		if(num[i]==2)
		{
			cnte++;
			e[++tope]=i;
		}
	}
	if(cnte<=2&&cnte!=0)
	{
		cout<<"NO"<<endl;
		return;
	}
	else cout<<"YES"<<endl;
	if(cnte>2)
	{
		for(int i=1;i<=tope;i++)
		{
			if(e[i+1]!=0)
			{
				f[e[i]][e[i+1]]='+';
				f[e[i+1]][e[i]]='-';
			}
			else
			{
				f[e[i]][e[1]]='+';
				f[e[1]][e[i]]='-';
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(f[i][j]==0)
			{
				f[i][j]='=';
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		f[i][i]='X';
	}
	rep(i,1,n)
	{
		rep(j,1,n)
		{
			cout<<f[i][j];
		}cout<<endl;
	}
}
int main()
{
	ios
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}

Problem - C - Codeforces

这题是题目没读懂。

有n个人,每个人有An个任务要说,如果一个人没有要说的东西了,他的发言将会被跳过,如果有一个合理的顺序,让一个人不会发言两次,这个发言顺序就叫做好顺序,统计好顺序的数量,对998244353取模。

如果有多个最大的数,明显发言顺序不会影响方案数,结果是A\binom{n}{n}

如果最大的数和次大的数差距大于1,那么很明显,没有好顺序。输出0;

如果最大的数和次大的数差距为1,那么最大的数一定要在次大的数前面。我们可以用插空法。

以样例最后一项为例

 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--) 
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{	
	ll x=0,w=1; char ch=0;ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*w;
}
inline void print(ll x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)print(x/10);
	putchar(x%10+48);
}		
const int N=2e5+5 , mod=998244353;
int t,n,num[N];
void solve()
{
	cin>>n;
	rep(i,1,n)cin>>num[i];
	int maxn=-1,dmaxn=-1;
	rep(i,1,n)
	{
		if(num[i]>maxn)
		{
			dmaxn=maxn;
			maxn=num[i];
		}
		else if(num[i]>dmaxn)
		{
			dmaxn=num[i];
		}
	}
	if(maxn==dmaxn)
	{
		ll tmp=1;
		for(int i=1;i<=n;i++)
		{
			tmp=(tmp*i)%mod;
		}
		cout<<tmp<<endl;
		return;
	}
	else if(maxn-dmaxn>1)
	{
		cout<<"0"<<endl;
		return;
	}
	else
	{
		int cntd=0;
		for(int i=1;i<=n;i++)
		{
			if(num[i]==dmaxn)cntd++;
		}
		ll tmp=1;
		for(int i=2;i<=cntd;i++)
		{
			tmp*=i;
			tmp%=mod;
		}
		tmp*=cntd;
		tmp%=mod;
		for(int i=cntd+2;i<=n;i++)
		{
			tmp*=i;
			tmp%=mod;
		}
		cout<<tmp<<endl;
		return ;
	}
	cout<<"b"<<endl;
}

int main()
{
	ios
	cin>>t;
	while(t--)solve();
	return 0;
}

"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、付费专栏及课程。

余额充值