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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值