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 T1:Brothers
分析:
数据很小 直接模拟 一开始要全部 + 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 T2:Crisis
分析:
随便搞都行 数据水
贪心 下属数从小到大 每次比对
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 T3:Word
分析:
本来还以为是什么字符串神算法 结果就是模拟
用第一个串 每次截取
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 T4:graph
分析:
线段树分治二分图 后面学了会 u p d q w q upd~qwq upd qwq