2021.8.13 提高A/B组模拟赛

本文介绍了四道编程竞赛题目,涉及矩阵操作、危机处理、字符串匹配和图论问题。在T1中,通过模拟所有可能的加1操作避免奇怪的输出。T2使用贪心策略解决下属分配问题,根据下属数量占比进行决策。T3通过字符串模拟找到满足条件的字符组合。T4则涉及到图的处理,可能需要线段树或二分图算法。这些题目展示了算法在解决复杂问题时的有效性。
摘要由CSDN通过智能技术生成

2021.8.13 2021.8.13 2021.8.13 模拟赛
目录:

T1.Brothers
T2.Crisis
T3.Word
T4.graph

T 1 : B r o t h e r s T1:Brothers T1Brothers

在这里插入图片描述
在这里插入图片描述

分析:

数据很小 直接模拟 一开始要全部 + 1 +1 +1 不然会 W A WA WA 很奇怪

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=105;
int n,R,C,k,a[N][N],ans[N][N];
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
int Atk(int x){return x>1?x-1:n;}
int main(){
	scanf("%d%d%d%d",&n,&R,&C,&k);
	for(int i=1;i<=R;i++)
	for(int j=1;j<=C;j++)
	{
		scanf("%d",&a[i][j]);
		a[i][j]++;
		ans[i][j]=a[i][j];
	}
	while(k--)
	{
		for(int i=1;i<=R;i++)
		for(int j=1;j<=C;j++)
		for(int x=0;x<4;x++)
			if(a[i+dx[x]][j+dy[x]]==Atk(a[i][j]))
				ans[i][j]=Atk(a[i][j]);
		for(int i=1;i<=R;i++)
		for(int j=1;j<=C;j++)
			a[i][j]=ans[i][j];
	}
	for(int i=1;i<=R;i++)
	{
		for(int j=1;j<=C;j++)
			printf("%d ",a[i][j]-1);
		printf("\n");
	}
	return 0;
}

T 2 : C r i s i s T2:Crisis T2Crisis

在这里插入图片描述

分析:

随便搞都行 数据水
贪心 下属数从小到大 每次比对 T % T\% T%即可

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+5;
int n,tot,head[N],w[N],ans[N],k[N];
struct node{
	int to,next;
}a[N];
double t;
void add(int x,int y)
{
	a[++tot]=(node){y,head[x]};
	head[x]=tot;
}
void dfs(int x)
{
	if(head[x]==0)
	{
		ans[x]=1;
		return;
	}
	int cnt=0;
	for(int i=head[x];i;i=a[i].next)
		dfs(a[i].to);
	for(int i=head[x];i;i=a[i].next)
		k[++cnt]=ans[a[i].to];
	sort(k+1,k+cnt+1);
	int res=k[1];
	for(int i=1;i<=cnt;i++)
	{
		double line=i/(w[x]*1.0);
		if(line>=t)
		{
			ans[x]=res;
			return;
		}
		if(i^cnt) res+=k[i+1];
	}
}
int main(){
	scanf("%d%lf",&n,&t);
	for(int i=1,x;i<=n;i++)
	{
		scanf("%d",&x);
		w[x]++;
		add(x,i);
	}
	t/=100;
	dfs(0);
	printf("%d",ans[0]);
	return 0;
}

T 3 : W o r d T3:Word T3Word

在这里插入图片描述

分析:

本来还以为是什么字符串神算法 结果就是模拟
用第一个串 每次截取 l l l个 和后面的串比对即可

模拟变量意如其名 卡一卡常能卡掉 1 s 1s 1s

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#pragma GCC optimize(2)
#define reg register
using namespace std;
const int N=55;
int l,d,k,len[N];
bool ok;
char s[N][N],a[N],x;
void dfs(int upd,int dep)
{
	ok=1;
	for(reg int i=1;i<=k;i++)
	{
		int check=l;
		for(reg int j=1;j<=len[i]-l+1;j++)
		{
			int diff=0;
			for(reg int now=1;now<=l;now++)
				if(a[now]!=s[i][now+j-1]) diff++;
			check=min(check,diff);
		}
		if(check>d){ok=0;break;}
	}
	if(ok||upd>d) return;
	for(reg int i=dep;i<=l;i++)
		for(reg int j=(int)('a');j<=(int)('z');j++)
		{
			char ch=a[i]; a[i]=j;
			dfs(upd+1,dep+1);
			if(ok) return;
			a[i]=ch;
		}
}
int main(){
	scanf("%d%d%d\n",&l,&d,&k);
	for(reg int i=1;i<=k;i++)
	{
		scanf("%c",&x);
		while(x!='\n')
		{
			s[i][++len[i]]=x;
			scanf("%c",&x); 
		}
	}
	for(reg int i=1;i<=len[1]-l+1;i++)
	{
		for(reg int j=i;j<=i+l-1;j++)
			a[j-i+1]=s[1][j];
		dfs(1,1);
		if(ok)
		{
			for(reg int i=1;i<=l;i++)
				putchar(a[i]);
			break;
		}
	}	
	return 0;
}

T 4 : g r a p h T4:graph T4graph

在这里插入图片描述

分析:

线段树分治二分图 后面学了会 u p d   q w q upd~qwq upd qwq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值